使用 ZooKeeper 时是否可以监视后代 znode 上的所有事件?
例如,如果我有:
(/)
/ \
(/a) (/b)
/ \
(/c) (/d)
有没有办法观察根目录对 /a、/b、/c 和 /d 的更改?
使用 ZooKeeper 时是否可以监视后代 znode 上的所有事件?
例如,如果我有:
(/)
/ \
(/a) (/b)
/ \
(/c) (/d)
有没有办法观察根目录对 /a、/b、/c 和 /d 的更改?
我知道这是一个老问题。我只是在这里发帖供像我这样的其他人参考。
我也在找这个。按照@sbridges 的提示,我想我可以这样做。
PathChildrenCache pathcache = new PathChildrenCache(client, "/some/path", true);
PathChildrenCacheListener listner1 = new PathChildrenCacheListener() {
Map<String, PathChildrenCache> listener2s = new HashMap<String, PathChildrenCache>();
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
String path = event.getData().getPath();
if(event.getType() == Type.CHILD_ADDED) {
PathChildrenCache cache2 = new PathChildrenCache(client, path, true);
cache2.getListenable().addListener(this);
cache2.start();
listener2s.put(path, cache2);
}
else if(event.getType() == Type.CHILD_REMOVED) {
PathChildrenCache cache2 = listener2s.remove(path);
if(cache2 != null) cache2.close();
}
System.out.println("" + Thread.currentThread().getId() + "\t" + event);
}
};
pathcache.getListenable().addListener(listner1);
如果有人发现有问题,请告诉我。
使用TreeCache而不是 PathCache
如果您将 zookeeper 版本升级到3.6.0 ,则可以使用Persistent, Recursive Watches。参见Persistent, Recursive Watches和Zookeeper Watchers