1

設定管理に 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();
                    }
                }};
4

1 に答える 1