設定管理に Zookeeper を使用する方法について読み続けています。
Zookeeper と簡単にやり取りするための Apache Curator があることは知っています。
一連のリソースに接続されているクライアントがいくつかあります。そして、それらのリソースを同じように使用する必要があります。リソース間のシャーディングやマスター選出のようなもの。
リソースの 1 つがダウンしていることにクライアントが注意した場合、クライアントが構成を変更し、他のクライアントがすぐに新しい構成の使用を開始できるように、zookeeper を使用したいと考えています。
そのため、1 つのクライアントが Zookeeper の znode のパスに構成を書き込み、他のクライアントがそのパスを監視します。
キュレーターでデータを設定する方法:
zk.setData().forPath(pathName, "data".getBytes());
キュレーターでパスを監視する方法:
zk.getData().usingWatcher(watcher).forPath(pathName);
ここで、パスの値が変更され、ウォッチがトリガーされると、パスの新しい値を取得する必要があります。それ、どうやったら出来るの?
これは常に process() 内で 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();
}
}};