我一直在阅读有关使用zookeeper进行配置管理的信息。
我知道有Apache策展人,可以方便地与动物园管理员互动。
我有一些客户端连接到一组资源。他们必须以同样的方式使用这些资源。诸如资源之间的分片和主选择之类的东西。
我想使用 zookeeper,这样如果客户端在给定时间内注意到其中一个资源已关闭,它可以更改配置,其他客户端可以立即开始使用新配置。
因此,一个客户端将配置写入 zookeeper 中 znode 的路径中,而其他客户端正在监视该路径。
如何在策展人中设置数据:
zk.setData().forPath(pathName, "data".getBytes());
如何在策展人中观看路径:
zk.getData().usingWatcher(watcher).forPath(pathName);
现在,当路径的值发生变化并且手表被触发时,我必须获取路径的新值。我该怎么做?
这总是在 proccess() 中返回 null
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();
}
}};
在策展人中有适配器:
* 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);