10,zookeeper -- watcher( 观察者对象 )

    xiaoxiao2023-12-01  150

    1 ,理论 : 盯住一个数据,看着他,一旦这个数据有什么变化,马上通知客户端。

        孙 :我找了一个人,不用他做任何工作,就负责帮我看着数据,一旦数据变化了,马上告诉我。

    2 ,应用 :银行卡的短信服务

        有这么一个程序,他不干别的,每天就看着你的银行卡,如果你的银行卡中的钱有变化,不管变多或者变少,他就告诉你,给你发短信,或者给你发邮箱。

    3 ,代码 :一次性观察者

    执行以下代码 : @Test // watch /a 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 // watch /a 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 { // 这个 this 指的就是我们刚刚 new 出的 Watcher zk.getData("/a",this,null); } catch (Exception e) { e.printStackTrace(); } } }, null); while(true){ Thread.sleep(1000); } }

    5 ,原理 :

    正常情况:观察你,直到你变了为止,就不观察了。我们的智慧成分:等你不观察我了,我在任务结束的时候重新注册你,让你再次观察我。看下图 :
    最新回复(0)