使用ZooKeeper时,是否可以观察后代znodes上的所有事件?
例如,如果我有:
(/)
/ \
(/a) (/b)
/ \
(/c) (/d)
有没有办法观察根对/ a,/ b,/ c和/ d的更改?
答案 0 :(得分:8)
没有ZooKeeper api可以做到这一点,你必须自己编写。
如果您使用Curator,则可以使用PathCache来维护节点上的监视以及该节点的子节点。当您发现正在观看的根的后代时,您可以编写一些代码来创建更多的PathCaches。
如果您打算推出自己的版本,那么实现起来确实非常棘手。这个blog描述了一些问题。
答案 1 :(得分:1)
我知道这是一个老问题。我只是在这里发帖,以供像我这样的其他人参考。
我也在寻找这个。按照@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);
如果有人发现错误,请告诉我。
答案 2 :(得分:1)
如果您将 zookeeper 版本升级到 3.6.0,则可以使用持久性递归监视。 见 Persistent, Recursive Watches 和 Zookeeper Watchers
答案 3 :(得分:0)
使用TreeCache代替PathCache