当使用ZooKeeper时,是否可以监视所有子znode上的事件?例如,如果我有:
(/) / \ (/a) (/b) / \ (/c) (/d)
是否有方法监视根目录中对/a、/B、/c和/d的更改?
zfycwa2u1#
没有ZooKeeper API可以做到这一点,您将不得不编写自己的。如果您使用Curator,则可以使用PathCache来维护节点及其子节点上的监视。您可以编写一些代码,以便在发现正在监视的根的后代时创建更多PathCache。如果你打算推出你自己的版本,这实际上是相当棘手的得到正确的。这个blog描述了一些问题。
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);
如果有人发现什么不对劲,请告诉我。
2admgd593#
使用TreeCache代替PathCache
50pmv0ei4#
如果您将zookeeper版本升级到3.6.0,则可以使用持久递归监视。请参阅Persistent, Recursive Watches和Zookeeper监视器此外,还有Curator Persistent Recursive Watcher支持。
4条答案
按热度按时间zfycwa2u1#
没有ZooKeeper API可以做到这一点,您将不得不编写自己的。
如果您使用Curator,则可以使用PathCache来维护节点及其子节点上的监视。您可以编写一些代码,以便在发现正在监视的根的后代时创建更多PathCache。
如果你打算推出你自己的版本,这实际上是相当棘手的得到正确的。这个blog描述了一些问题。
klh5stk12#
我知道这是一个老问题。我只是张贴在这里参考其他一些人喜欢我。
我也在找这个。按照@ s bridges的提示,我想我可以这样做。
如果有人发现什么不对劲,请告诉我。
2admgd593#
使用TreeCache代替PathCache
50pmv0ei4#
如果您将zookeeper版本升级到3.6.0,则可以使用持久递归监视。请参阅Persistent, Recursive Watches和Zookeeper监视器
此外,还有Curator Persistent Recursive Watcher支持。