下面通过一个示例演示, 如何监听一个node并接收和处理状态变更.
监听和处理事件
要实现监听, 首先需要实现Watcher
接口:
public interface Watcher { |
然后再使用ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
创建实例同时设置Watcher
, 当有事件发生的时候, 那么Watcher.process(WatchedEvent watchedEvent)
将会被调用以处理事件, 比如连接、过期、中断、node 修改、子node修改等事件。
代码示例:
|
StatCallback
上面的代码中有一个 exists()
, 主要是进行检查node的状态并处理变更, 源码如下:
|
从上可知, 我们需要传入一个StatCallback
的实现, 进行 node state 改变的相关处理, org.apache.zookeeper.AsyncCallback.StatCallback
接口定义如下 :
public interface AsyncCallback { |
实现代码举例:
|
processResult()
的调用关系图如下:
可知, 当执行以下动作时, processResult()
将会被调用 (因为 node state changed):
ZooKeeper.create(String, byte[], List<ACL>, CreateMode, StringCallback, Object) |
然后在processResult()
里面我们就可以处理变更的node了.
示例源码
最后, 附上官网的 example 源码, 可以运行以下的代码体验一下更深刻:
DataMonitor
主要用来进行事件处理 process(WatchedEvent event)
和 state changed 处理 processResult(int rc, String path, Object ctx, Stat stat)
.
public class DataMonitor implements Watcher, StatCallback { |
Executor
启动程序和初始化, 根 Watcher,资源管理:
public class Executor |
参考
ZooKeeper Programmer's Guide
https://zookeeper.apache.org/doc/r3.4.6/javaExample.html