当前位置: 首页 > 知识库问答 >
问题:

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

弘烨烁
2023-03-14

我正在做一个项目,在这个项目中,我需要在一个节点上维护一个表,并且该节点也包括子节点。我尝试过使用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个答案

丌官玺
2023-03-14

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

我可以建议使用以下方法

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

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

罗华翰
2023-03-14

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

 类似资料:
  • 我最近开始为Zookeeper使用Python。我正在使用动物园管理员的库。我需要监视我的根节点- 可能会添加到我上面的根节点的其他几个节点如下- 现在我需要检查添加到根节点中的子节点是否为。如果节点被添加到中,那么我将只监视节点,如果任何新的子节点被添加到节点中,那么我也需要监视该节点。 比如说,的子代是,所以现在我需要监视,然后如果在这个节点上添加了任何新节点,比如和,那么我需要打印节点的子节

  • 我在docker容器中运行了一个简单的Node.js HTTP服务器。其中一个基本结构文件夹使用from镜像主机和容器目录。 在节点服务器中,我使用NPM包,设置了一个监视程序来跟踪卷目录中的更改(尽管我已经尝试了多个其他监视程序,结果相同)。 当我在本地运行节点服务器时,观察者会正确地拾取对所监视目录的更改。在这种情况下,将这些报告为或,这对应于我运行的脚手架脚本,用于在目录中添加或删除新文件夹

  • 我最近开始使用。我正在使用库for ZooManager。 我有一个非常简单的使用kazoo for Zookeeper的用例。我有一个根节点-。现在我需要监视根节点,如果添加到根节点的新节点是,那么我只监视节点。除了节点之外,我不想监视任何其他节点。然后,如果有任何新的子节点被添加到节点,那么我也会监视它们。 假设下面的孩子加起来- 然后我也会监视节点。 在动物园管理员中使用Kazoo可以做到这

  • 本文向大家介绍Zookeeper Watcher(事件监听器)?相关面试题,主要包含被问及Zookeeper Watcher(事件监听器)?时的应答技巧和注意事项,需要的朋友参考一下 Watcher(事件监听器),是 ZooKeeper 中的一个很重要的特性。ZooKeeper 允许用户在指定节点上注册一些 Watcher,并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴

  • 本文向大家介绍Zookeeper 如何选举master 主节点?相关面试题,主要包含被问及Zookeeper 如何选举master 主节点?时的应答技巧和注意事项,需要的朋友参考一下 还记得上面我们的所说的临时节点吗?因为 的强一致性,能够很好地在保证 在高并发的情况下保证节点创建的全局唯一性 (即无法重复创建同样的节点)。 利用这个特性,我们可以 让多个客户端创建一个指定的节点 ,创建成功的就是

  • 我正在尝试用CuratorFramework创建一个基于动物园管理员的应用程序。该应用程序必须能够在更多的节点上以仲裁的方式运行。应用程序的每个实例都嵌入了动物园管理员服务器和客户端的实例。节点在仲裁中被成功地删除。每个节点都向 /workers/active/node1写入一个EPHEMERAL节点(“活动”是由领导者创建的PERSISTENT znode)。因为当客户端连接到动物园管理员服务器