1 ,理论 : 盯住一个数据,看着他,一旦这个数据有什么变化,马上通知客户端。
孙 :我找了一个人,不用他做任何工作,就负责帮我看着数据,一旦数据变化了,马上告诉我。
2 ,应用 :银行卡的短信服务
有这么一个程序,他不干别的,每天就看着你的银行卡,如果你的银行卡中的钱有变化,不管变多或者变少,他就告诉你,给你发短信,或者给你发邮箱。
3 ,代码 :一次性观察者
执行以下代码 :
@Test
public void wct() throws IOException
, InterruptedException
, KeeperException
{
ZooKeeper zk
= new ZooKeeper("node01:2181,node02:2181,node03:2181",5000,null
);
zk
.getData("/a", new Watcher() {
public void process(WatchedEvent watchedEvent
) {
System
.out
.println("报告主人,/a 数据被人家动过了...");
}
}, null
);
while(true){
Thread
.sleep(1000);
}
}
观察 idea 控制台,他会卡住 : 去 zookeeper 客户端修改 /a 节点的数据 : set /a dadasda 观察 idea 控制台 : 看到打印输出 5 ,结论 : 观察者对象,确实可以一直的监控每个节点的数据,当这个节点的数据被修改的时候,就会触发观察者节点的方法执行。
4 ,代码 :一直在观察
@Test
public void wct() throws IOException
, InterruptedException
, KeeperException
{
final ZooKeeper zk
= new ZooKeeper("node01:2181,node02:2181,node03:2181",5000,null
);
zk
.getData("/a", new Watcher() {
public void process(WatchedEvent watchedEvent
) {
System
.out
.println("报告主人,/a 数据被人家动过了...");
try {
zk
.getData("/a",this,null
);
} catch (Exception e
) {
e
.printStackTrace();
}
}
}, null
);
while(true){
Thread
.sleep(1000);
}
}
5 ,原理 :
正常情况:观察你,直到你变了为止,就不观察了。我们的智慧成分:等你不观察我了,我在任务结束的时候重新注册你,让你再次观察我。看下图 :