9

我正在做一个项目,我需要在一个节点上维护一个手表,以及该节点的子节点。我曾尝试使用 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"使用以下代码触发手表。但是,如果我向or添加任何新节点,则不会触发任何手表,我也不确定如何为此添加代码?任何想法如何做到这一点?"/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。

4

2 回答 2

7

改用 TreeCache。它完成了 PathCache 所做的一切,并且可以处理子节点。

于 2015-05-28T09:01:59.917 回答
2

你得到这个问题的解决方案了吗?

我可以建议使用孩子的一种技巧,例如:

  • /my/test/test1_node1
  • /my/test/test1_node2

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

于 2014-03-03T09:32:15.017 回答