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

我在开发中使用 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 中提供的方法吗?


慕沐林林
浏览 252回答 1
1回答

拉丁的传说

当一个 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()定期运行以查看当前状态。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java