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 に答える