是否可以在ZooKeeper中监视所有后代节点上的事件?

jaql4c8m  于 2022-12-09  发布在  Apache
关注(0)|答案(4)|浏览(140)

当使用ZooKeeper时,是否可以监视所有子znode上的事件?
例如,如果我有:

(/)
     /  \
   (/a)  (/b)
   /       \
(/c)       (/d)

是否有方法监视根目录中对/a、/B、/c和/d的更改?

zfycwa2u

zfycwa2u1#

没有ZooKeeper API可以做到这一点,您将不得不编写自己的。
如果您使用Curator,则可以使用PathCache来维护节点及其子节点上的监视。您可以编写一些代码,以便在发现正在监视的根的后代时创建更多PathCache。
如果你打算推出你自己的版本,这实际上是相当棘手的得到正确的。这个blog描述了一些问题。

klh5stk1

klh5stk12#

我知道这是一个老问题。我只是张贴在这里参考其他一些人喜欢我。
我也在找这个。按照@ s bridges的提示,我想我可以这样做。

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);

如果有人发现什么不对劲,请告诉我。

50pmv0ei

50pmv0ei4#

如果您将zookeeper版本升级到3.6.0,则可以使用持久递归监视。请参阅Persistent, Recursive Watches和Zookeeper监视器
此外,还有Curator Persistent Recursive Watcher支持。

相关问题