2017-02-13 101 views
2

我使用下面的代码来提取饲养员卡夫卡券商名单:异常,而试图获取从饲养员节点数据:

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 ""; 
    } 

上面的代码工作当一个线程执行代码的罚款:(ConnectionLoss KeeperErrorCode)一次。 然而,当多个线程执行上面的代码失败与下面的异常偶尔:

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) 

什么我错在这里做什么? 我的动物园管理员版本是3.4.6-1569965。

回答

1

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

“会话的建立是异步的,此构造将启动连接到服务器,并立即返回。 - 潜在的(通常)前会话被完全建立。观察者参数指定将被通知的守望者状态的任何改变,这个通知可以在构造函数调用返回之前或之后的任何时刻发生。“

你必须等待往返动物园管理员连接,充分estabilish: https://www.tutorialspoint.com/zookeeper/zookeeper_quick_guide.htm

向下滚动到API部分“连接到ZooKeeper的合奏”

+1

我试着给你的建议。然而,它暂时解决了这个问题,当负载进一步增加时,我又开始面临这个问题。 –