public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorWatcher> {
private final CuratorFramework client;
。。。。。省略部分代码
/**
* curator在注册watch事件上,提供了一个usingWatcher方法,使用这个方法注册的watch事件和默认watch事件一样,
* 监听只会触发一次,监听完毕后就会销毁,也就是一次性的。
* 而这个方法有两种参数可选,一个是zk原生API的Watcher接口的实现类,
* 另一个是Curator提供的CuratorWatcher接口的实现类,不过在usingWatcher方法上使用哪一个效果都是一样的,都是一次性的。
*
* CuratorWatcher事件监听,注册一次监听一次 注册多次监听多次
*/
private class CuratorWatcherImpl implements CuratorWatcher {
private volatile ChildListener listener;
public CuratorWatcherImpl(ChildListener listener) {
this.listener = listener;
}
public void unwatch() {
this.listener = null;
}
@Override
public void process(WatchedEvent event) throws Exception {
if (listener != null) {
String path = event.getPath() == null ? "" : event.getPath();
listener.childChanged(path,
// if path is null, curator using watcher will throw NullPointerException.
// if client connect or disconnect to server, zookeeper will queue
// watched event(Watcher.Event.EventType.None, .., path = null).
/**
* CuratorWatcher事件监听,注册一次监听一次
* 这里又用到了client.getChildren().usingWatcher(this).forPath(path)
* 相当于再次注册 因为:
* curator在注册watch事件上,提供了一个usingWatcher方法,使用这个方法注册的watch事件和默认watch事件一样,
* 监听只会触发一次,监听完毕后就会销毁,也就是一次性的。、
* 而这个方法有两种参数可选,一个是zk原生API的Watcher接口的实现类,
* 另一个是Curator提供的CuratorWatcher接口的实现类,不过在usingWatcher方法上使用哪一个效果都是一样的,
* 都是一次性的。
*/
StringUtils.isNotEmpty(path)
? client.getChildren().usingWatcher(this).forPath(path)
: Collections.<String>emptyList());
}
}
}
}