A Simple Watch Client:一个简单的监听器示例
功能:通过读取Znode的数据来启动某个服务。并且动态监听Znode变更事件,如果znode发生变化,则传入新数据并重启服务,如果节点被删除,则服务停止.需要传入几个参数:Zookeeper服务端地址、Znode名称、用于写数据的文件、带参数的执行体
设计:实现两个工具类,Executor用于保持会话,并且提供某个可执行服务。DataMonitor用于监听数据变化
辅助文件:数据文件A用于存储从znode里获取的数据,指令文件B用于通过Java exec调用
Executor Class:分为5部分
Eexcutor:继承了Watcher接口,实现了process方法,用于事件回调。继承了runnable接口,实现run方法,用于保证客户端不退出。继承自定义的DataMonotorListener接口,实现了exists和closing方法。当znode创建或者删除时会触发调用exists方法,当会话过期时会触发closing方法。
DataMonitor class:主要分为3部分
再来看下执行过程
首先启动服务,这个时候zookeeper不存在/test 这个节点。会看到如下输出:
创建/test:然后在zookeeper服务端创建/test ,create /test "data1",然后看到客户端输出:
更改/test 的值:set /test "data2",然后看到客户端输出:
删除/test,:delete /test,看到如下输出:
并且看下本地数据文件里写入的内容:
至于说,当znode状态发生变化如何回调watcher的process方法,以及异步请求完成后如何自动回调StatCallback的processResult方法,我们在另一篇源码分析里来一探究竟
参考文章:http://zookeeper.apache.org/doc/current/javaExample.html