提问者:小点点

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


我正在做一个项目,在这个项目中,我需要在一个节点上维护一个表,并且该节点也包括子节点。我尝试过使用PathCache,但我不知道如何在这里监视孩子们的孩子?

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

"/my/test/test1"
"/my/test/test2"
"/my/test/test3"

然后我应该得到通知(直到这一部分我能够使它工作),但如果任何新节点被添加、更新或删除到“/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();
    }
}

下面是我的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);
}

有人能为我的用例提供一个简单的例子吗?我正在使用最近发布的Curator 2.4.0。


共2个答案

匿名用户

改用TreeCache。它完成了PathCache plus能够处理子节点的所有功能。

匿名用户

你找到解决这个问题的方法了吗?

我可以建议使用以下方法:

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

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