我在开发中使用 ZooKeeper 已有一段时间了,但我似乎没有得到的一件事是没有办法(至少我无法弄清楚)如何在创建连接时指定超时ZooKeeper 服务器例如:ZooKeeper zoo; final CountDownLatch connectedSignal = new CountDownLatch(1); zoo = new ZooKeeper("localhost:2182", 5000, new Watcher() { public void process(WatchedEvent we) { if (we.getState() == KeeperState.SyncConnected) { connectedSignal.countDown(); } if (we.getState() == KeeperState.Disconnected) { connectedSignal.countDown(); } if (we.getType() == Event.EventType.None) { connectedSignal.countDown(); } } }); System.out.println("in watcher"); connectedSignal.await();请注意,如果 ZooKeeper 服务器关闭,似乎不会发生超时,因此不会引发异常,并且我的代码始终等待倒计时锁存器。我也尝试在 zoo.cfg 中设置此属性,但它没有任何效果:zookeeper.connection.timeout.ms=5000需要帮助了解 Java API 中是否为 ZooKeeper 提供了某种方法来检查是否无法成功地创建到 ZooKeeper 服务器的连接?注意,我知道我们可以通过 executorservice 和 futures 来做到这一点,但我需要 API 中提供的方法吗?
1 回答
拉丁的传说
TA贡献1789条经验 获得超8个赞
当一个 ZooKeeper 对象被创建时,它也会创建两个线程:IO 线程和 Event 线程。IO 线程将进行会话维护,例如重新连接到 ZooKeeper 服务器和维护心跳。
而在上面的代码中,5000是会话超时值,它起作用了!如果启用日志记录,你会发现心跳日志,
org.apache.zookeeper.ClientCnxn - Got ping response for sessionid 0x...
并且在断开连接时
org.apache.zookeeper.ClientCnxn - Session 0x... for server null, unexpected error, closing socket connection and attempting reconnect...`
现在,我们需要知道 Watch 有一些限制
当您与服务器断开连接时(例如,当服务器发生故障时),在重新建立连接之前,您将无法获得任何监视。
由于我们在断开连接时无法接收任何观察者事件,因此 connectedSignal.await()在实践中可能有点危险。您可以尝试使用超时版本connectedSignal.await(5000),或者您将等到连接恢复。
如果你想监控与 ZK 服务器的连接,你可以生成一个单独的线程,zoo.getState()定期运行以查看当前状态。
添加回答
举报
0/150
提交
取消
