如何使用curator监视ZooKeeper中后代节点上的事件?

AKI*_*WEB 9 java apache-zookeeper apache-curator

我正在开发一个项目,我需要在节点上维护一个监视器,并且节点也是子节点.我尝试过使用PathCache,但我不确定如何在这里观看儿童的孩子?

这里我的根节点是 - "/my/test"我正在使用下面的代码监视该节点.我想做的是,让手表保持在"/my/test"znode上.假设这些节点被添加到我的根节点 -

"/my/test/test1"
"/my/test/test2"
"/my/test/test3"
Run Code Online (Sandbox Code Playgroud)

然后,我应该得到通知(直到这部分我能使其工作),但如果有新的节点被添加,更新或删除来"/my/test/test1","/my/test/test2""/my/test/test3"那我也应该得到通知,这是我无法理解如何将部分让它起作用.

每当我加入任何新的节点"/my/test",例如"/my/test/test1","/my/test/test2","/my/test/test3"那么手表被触发同用下面的代码.但是,如果我要添加任何新节点,"/my/test/test1"或者"/my/test/test2"没有手表被触发,我不知道如何添加代码呢?有什么想法可以做到这一点?

可能如果有人在过去这样做了..所以任何一个例子对我都有很大的帮助..

以下是我的代码,适用于"/my/test"儿童,但不适用于儿童"/my/test/test1"等等.

private static final String PATH = "/my/test";

public static void main(String[] args) {
    CuratorFramework client = null;
    PathChildrenCache cache = null;
    try {
        client = CuratorClient.createSimple("localhost:2181");
        client.start();

        // in this example we will cache data. Notice that this is optional.
        cache = new PathChildrenCache(client, PATH, true);
        cache.start();

        addListener(cache);

        for(;;) {
            try {
                Thread.sleep(50000);
            } catch(InterruptedException e) {
            }
        }
    } catch (Exception e1) {
        e1.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是我的addListener方法 -

private static void addListener(PathChildrenCache cache) {

    PathChildrenCacheListener listener = new PathChildrenCacheListener() {
        public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
            switch (event.getType()) {
            case CHILD_ADDED: {
                System.out.println("Node added: " + ZKPaths.getNodeFromPath(event.getData().getPath()));
                break;
            }

            case CHILD_UPDATED: {
                System.out.println("Node changed: "    + ZKPaths.getNodeFromPath(event.getData().getPath()));
                break;
            }

            case CHILD_REMOVED: {
                System.out.println("Node removed: "    + ZKPaths.getNodeFromPath(event.getData().getPath()));
                break;
            }
            default:
                break;
            }
        }
    };
    cache.getListenable().addListener(listener);
}
Run Code Online (Sandbox Code Playgroud)

任何人都可以为我的用例提供一个简单的例子吗?我正在使用最近发布的Curator 2.4.0.

msj*_*msj 7

请改用TreeCache.它完成了PathCache所能做的所有事情以及处理子节点.


小智 2

你有解决这个问题吗?

我可以建议使用这样的孩子们的一种技巧:

  • /我的/测试/test1_node1
  • /我的/测试/test1_node2

因此将 test1 的子节点附加到 test1 本身的名称中。