为了账号安全,请及时绑定邮箱和手机立即绑定

创建与zookeeper服务器的连接时如何指定超时

创建与zookeeper服务器的连接时如何指定超时

慕沐林林 2022-06-30 11:00:22
我在开发中使用 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()定期运行以查看当前状态。


查看完整回答
反对 回复 2022-06-30
  • 1 回答
  • 0 关注
  • 251 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号