Apache zookeeper 是否可以监视ZooKeeper中所有子代节点上的事件?
使用ZooKeeper时,是否可以监视后代znode上的所有事件 例如,如果我有:Apache zookeeper 是否可以监视ZooKeeper中所有子代节点上的事件?,apache-zookeeper,Apache Zookeeper,使用ZooKeeper时,是否可以监视后代znode上的所有事件 例如,如果我有: (/) / \ (/a) (/b) / \ (/c) (/d) 有没有办法监视根目录对/a、/b、/c和/d的更改?没有ZooKeeper api可以做到这一点,您必须自己编写 如果您正在使用,则可以使用维护节点上的监视以及该节点的子节点。当您发现正在监视的根的后代时,可以编写一些代码来创建更多的PathCache 如果你打算推出你自己的版本,这实际上
(/)
/ \
(/a) (/b)
/ \
(/c) (/d)
有没有办法监视根目录对/a、/b、/c和/d的更改?没有ZooKeeper api可以做到这一点,您必须自己编写 如果您正在使用,则可以使用维护节点上的监视以及该节点的子节点。当您发现正在监视的根的后代时,可以编写一些代码来创建更多的PathCache
如果你打算推出你自己的版本,这实际上是相当棘手的得到正确的。这描述了一些问题。我知道这是一个老问题。我只是在这里发布,供像我这样的人参考 我也在找这个。按照@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);
PathChildrenCache-pathcache=new-PathChildrenCache(客户端,“/some/path”,true);
PathChildrencCacheListener Listener1=新的PathChildrencCacheListener(){
Map listener2s=新HashMap();
@凌驾
public void childEvent(CuratorFramework客户端,PathChildrenCacheEvent事件)引发异常{
字符串路径=event.getData().getPath();
if(event.getType()==Type.CHILD_添加){
PathChildrenCache2=新的PathChildrenCache(客户端,路径,true);
cache2.getListenable().addListener(此);
cache2.start();
listener2s.put(路径,cache2);
}
else if(event.getType()==Type.CHILD\u已删除){
PathChildrenCache2=listener2s.remove(路径);
如果(cache2!=null)cache2.close();
}
System.out.println(“+Thread.currentThread().getId()+”\t“+事件);
}
};
pathcache.getListenable().addListener(Listener1);
如果有人发现问题,请告诉我。如果您将zookeeper版本升级到3.6.0,可以使用持久递归手表,而不是路径缓存。 看到和
也有支持。您可以在收到通知(添加了child_)和在child上注册手表之间释放孩子的事件这是一项新功能吗?从哪个版本开始?@SswaterShi从v2.7开始就有了()