尝试从 zookeeper 节点获取数据时出现异常:(KeeperErrorCode: ConnectionLoss )

vat*_*ada 7 java apache-zookeeper

我正在使用以下代码从 Zookeeper 中提取 Kafka 经纪人列表:

private static String getBrokerList() {
        try {
            ZooKeeper zookeeper = new ZooKeeper(zookeeperConnect, 15000, null);
            List<String> ids = zookeeper.getChildren(ZkUtils.BrokerIdsPath(), false);
            List<String> brokerList = new ArrayList<>();
            for (String id : ids) {
                String brokerInfo = new String(zookeeper.getData(ZkUtils.BrokerIdsPath() + '/' + id, false, null), Charset.forName("UTF-8"));
                JsonObject jsonElement = new JsonParser().parse(brokerInfo).getAsJsonObject();
                String host = jsonElement.get("host").getAsString();
                brokerList.add(host + ':' + jsonElement.get("port").toString());
            }
            return Joiner.on(",").join(brokerList);
        } catch (KeeperException | InterruptedException e) {
            Throwables.propagate(e);
        }
        return "";
    }
Run Code Online (Sandbox Code Playgroud)

当一个线程一次执行代码时,上面的代码工作正常。但是,当多个线程执行上述代码时,它偶尔会失败并出现以下异常:

Caused by: org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /brokers/ids
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:99)
    at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
    at org.apache.zookeeper.ZooKeeper.getChildren(ZooKeeper.java:1532)
    at org.apache.zookeeper.ZooKeeper.getChildren(ZooKeeper.java:1560)
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?我的zookeeper版本是3.4.6-1569965。

Zer*_*mus 5

来自http://zookeeper.apache.org/doc/r3.4.9/api/org/apache/zookeeper/ZooKeeper.html#ZooKeeper(java.lang.String,%20int,%20org.apache.zookeeper.Watcher)

“会话建立是异步的。此构造函数将启动与服务器的连接并立即返回 - 可能(通常)在会话完全建立之前。观察者参数指定将收到状态变化通知的观察者。此通知可以在构造函数调用返回之前或之后的任何点。”

你必须等待zookeeper连接完全建立:https : //www.tutorialspoint.com/zookeeper/zookeeper_quick_guide.htm

向下滚动到 api 部分“连接到 ZooKeeper Ensemble”