2017-02-13 2 views
2

Я использую следующий код, чтобы извлечь Кафка список брокера из зоопарка:Исключение при попытке извлечь данные из Zookeeper узла: (KeeperErrorCode: ConnectionLoss)

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

Приведенный выше код работает прекрасно, когда один поток выполнения кода в время. Однако, когда несколько потоков выполнения кода выше она не за исключением следующего: иногда

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) 

Что я делаю неправильно здесь? Моя версия zookeeper - 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)

«создания сеанса является асинхронным Этот конструктор будет инициировать соединение с сервером и немедленно вернуться. -. Потенциально (обычно) до начала сессии полностью установлена ​​наблюдающий аргумент указывает наблюдатель, который будет уведомлен о любые изменения состояния. Это уведомление может появляться в любой точке до или после вызова конструктора ».

Вы должны ждать Фро соединение Zookeeper полностью estabilish: https://www.tutorialspoint.com/zookeeper/zookeeper_quick_guide.htm

прокрутите вниз до раздела апи «Подключение к Zookeeper ансамбля»

+1

Я попробовал предложение, данное вами. Однако это временно решило проблему, и я снова начал сталкиваться с проблемой, когда загрузка увеличилась. –

Смежные вопросы