2017-03-01 118 views
1

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

+0

您想了解其他客户端的会话丢失情况吗?任何会话丢失?你能举一个你想要找出的例子吗? – Randgalt

+0

下面提供了答案 – Hegemon

回答

1

答案很简单,可以使用Ephemeral节点和PathChildrenCache来完成。 Zookeeper会检测节点何时超时(在本例中,我们将超时设置为10秒),并且相关的临时节点将从树中消失。这将引发我们可以倾听的事件。

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

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

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

下一页使用PathChildrenCache分配的饲养员事件侦听器。事件类型包括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(); 

现在在远程节点上,添加了短暂的节点(在这里我们给它的33的ID没有有效载荷)

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

现在拉远程节点上的插头和事件应该是检测到听众分配的位置。