Как использовать Zookeeper с куратором для управления конфигурацией?
Я продолжаю читать об использовании zookeeper для управления конфигурацией.
Я знаю, что есть Apache Curator для легкого взаимодействия с zookeeper.
У меня есть несколько клиентов, подключенных к набору ресурсов. И они должны использовать эти ресурсы одинаково. Вещи как осколки и мастерские выборы между ресурсами.
Я хочу использовать zookeeper, чтобы, если клиент в определенный момент времени заметил, что один из ресурсов не работает, он может изменить конфигурацию, а другие клиенты могут немедленно начать использовать новую конфигурацию.
Таким образом, один клиент записывает конфигурацию в путь в znode в zookeeper, а другие клиенты следят за этим путем.
Как установить данные в кураторе:
zk.setData().forPath(pathName, "data".getBytes());
Как посмотреть дорожку в кураторе:
zk.getData().usingWatcher(watcher).forPath(pathName);
Теперь, когда значение пути изменяется и часы запускаются, я должен получить новое значение пути. Как я могу это сделать?
Это всегда возвращает ноль внутри процесса ()
zk.getData().watched().inBackground().forPath(pathName)
Другой вопрос: как сказано в документации, после того, как я получу новое значение, нужно ли снова устанавливать наблюдатель?
Источник наблюдателя:
CuratorWatcher watcher = new CuratorWatcher(){
public void process(WatchedEvent event) {
System.out.println("event wt");
System.out.println(ToStringBuilder.reflectionToString(event));
try {
System.out.println(zk.getData().watched().inBackground().forPath(pathName));
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
};
System.out.println("event wt");
try {
zk.getData().usingWatcher(this).forPath(pathName);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}};
1 ответ
В кураторе есть адаптер:
* Get children and set the given watcher on the node.
*/
return client.getChildren().usingWatcher(watcher).forPath(path);
или вы можете использовать CuratorListener
/**
* Get children and set a watcher on the node. The watcher notification will come through the
* CuratorListener (see setDataAsync() above).
*/
return client.getChildren().watched().forPath(path);