8

使用 ZooKeeper 时是否可以监视后代 znode 上的所有事件?

例如,如果我有:

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

有没有办法观察根目录对 /a、/b、/c 和 /d 的更改?

4

4 回答 4

8

没有 ZooKeeper api 可以做到这一点,您必须自己编写。

如果您正在使用Curator,则可以使用PathCache维护节点上的手表以及该节点的子节点。当您发现正在观察的根的后代时,您可以编写一些代码来创建更多的 PathCache。

如果您要推出自己的版本,实际上很难做到正确。这个博客描述了一些问题。

于 2012-08-24T04:07:51.227 回答
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);

如果有人发现有问题,请告诉我。

于 2014-11-05T13:33:19.357 回答
1

使用TreeCache而不是 PathCache

于 2018-12-23T19:44:52.630 回答
1

如果您将 zookeeper 版本升级到3.6.0 ,则可以使用Persistent, Recursive Watches。参见Persistent, Recursive WatchesZookeeper Watchers

还有Curator Persistent Recursive Watcher支持。

于 2021-04-01T01:55:58.880 回答