Наблюдатель куратора Zookeeper не получает никаких событий

Я пытался использовать куратор apache для zookeeper, но не смог добиться прогресса. Все, что я ищу, это установить наблюдателя на узле zk и прослушивать все изменения данных на этом конкретном узле. Я написал простую программу, чтобы попробовать это, но я не получаю никаких событий. Вот мой код:

CuratorFramework curator = new ZookeeperClient(zkHosts).getConnection();

    CompletableFuture.runAsync(() -> {
        CuratorWatcher curatorWatcher = event -> System.out.println("Watched event: " + event);

        try {
            curator.getChildren().usingWatcher(curatorWatcher).forPath(NODE_PATH);
        } catch (Exception e) {
            e.printStackTrace();
        }
    });

    CompletableFuture.runAsync(() -> {
        try {
            curator.setData().forPath(NODE_PATH, "randomdata1".getBytes());
            curator.setData().forPath(NODE_PATH, "randomdata2".getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        }
    });

Спасибо за помощь!


person Aegis    schedule 02.02.2019    source источник


Ответы (1)


В Zookeeper методы getData() и exists() устанавливают наблюдение за данными. getChildren() устанавливает дочерние часы; подробнее см. ZooKeeper Watch.

Вы должны использовать curator.getData() вместо curator.getChildren() в первом runAsync(), так как вы делаете setData() во втором runAsync().

Если вы хотите сохранить curator.getChildren(), вам следует добавить нового дочернего элемента под NODE_PATH для тестирования.

person Jacky1205    schedule 03.02.2019
comment
Благодарю вас! Я также понял, что часы — это разовое событие, поэтому я установил больше часов для непрерывного уведомления. - person Aegis; 03.02.2019