如何检测Apache Zookeeper会话何时丢失或超时?

时间:2017-03-01 19:01:53

标签: java apache-zookeeper apache-curator

假设我们已启动并运行Apache Zookeeper仲裁,并且已连接 n 客户端节点(使用Apache Curator)。当任何其他节点会话终止或达到超时时,是否可以从zookeeper接收其中一个节点(我们正在观察的节点)上的通知?如果是这样,这是如何实现的?

1 个答案:

答案 0 :(得分:1)

答案非常简单,可以使用Ephemeral节点和PathChildrenCache来完成。 Zookeeper将检测节点何时超时(在此示例中我们将超时设置为10秒),并且关联的短暂节点将从树中消失。这将触发我们可以听取的事件。

首先与策展人客户端建立连接并在所有节点上启动

CuratorFramework curator =
    CuratorFrameworkFactory
        .newClient(zkConnectionString, 10000, 10000, retryPolicy);

curator.start();
curator.getZookeeperClient().blockUntilConnectedOrTimedOut();

接下来,使用PathChildrenCache为zookeeper事件分配侦听器。事件类型包括CHILD_ADDED,CHILD_UPDATED和CHILD_REMOVED。回调中的事件对象将包含已关闭的节点的相关信息(以及可能的相关有效负载)。

PathChildrenCache pathCache = new PathChildrenCache(curator, "/nodes", true);
pathCache
    .getListenable()
    .addListener((curator, event) -> {
        if (event.getType() == Type.CHILD_REMOVED) {
            System.out.println("Child has been removed");
        }
    });
pathCache.start();

现在在远程节点上添加临时节点(这里我们给它一个没有有效负载的ID为33)

curator
    .create()
    .creatingParentsIfNeeded()
    .withMode(CreateMode.EPHEMERAL)
    .forPath("/nodes/33");

现在拔出远程节点上的插件,应该检测到已分配监听器的事件。