Zookeeper Java APIの使用
Zookeeper Java APIの使用について説明します
対応するJarパッケージを導入 bulidPath解凍ダウンロードzookeeper-3.4.9.tar.gzのルートディレクトリにはjar があります.
eclipseのbuildPathにzookeeper-3.4.9.jarを導入 mavenが構築したプロジェクトがmavenが構築したプロジェクトであれば、以下の依存 を加える.
1、接続 connectionStringは、クラスタの場合に使用する接続情報です. sessionTimeoutとは、セッションの有効期限を指し、その値minSessionTimeoutはtickTimeの最小2倍、最大値maxSessionTimeoutはtickTimeの20倍である.入力値がこの範囲で実際に機能しない場合でも、minSessionTimeoutからmaxSessionTimeoutまでの です.
2、ノードの作成
を選択します.
説明
CreateMode.PERSISTENT
永続ノード
CreateMode.PERSISTENT_SEQUENTIAL
永続シーケンスノード
CreateMode.EPHEMERAL
セッションが切断または期限切れになったときに削除される一時ノード
CreateMode.PERSISTENT_SEQUENTIAL
セッションが切断または期限切れになったときに削除される一時シーケンスノード
3、ノードの取得
4、ノードデータの修正
5、サブノードの作成
6、サブノードの取得
注意:getChildrenメソッドは、サブポイントが変化したときにWatcher()というリスナーをトリガーします.
7、ノードの削除
8、接続を閉じる
注意:一般的にclose()メソッドはfinallyコードブロックで実行されます.
KeeperErrorCode=ConnectionLossエラーについて
Zookeeper APIを使用すると、接続が完了しないままzookeeperのget/create/exists操作を実行するため、次のエラーが発生することがよくあります.
解決策は、Zookeeper接続の初期化が完了してからインスタンスを使用することです.以下はサンプルコードです.
注意:Zookeeperのモニタリングは、getData()、exists()、getChildren()のいくつかのメソッドを使用する場合にのみwatcherがトリガーされます.
対応するJarパッケージを導入
zookeeper-3.4.9.jar
eclipseのbuildPathにzookeeper-3.4.9.jarを導入
<dependency>
<groupId>org.apache.zookeepergroupId>
<artifactId>zookeeperartifactId>
<version>3.4.9version>
dependency>
1、接続
String connectionString = "127.0.0.1:2181";
int sessionTimeout = 30000;
ZooKeeper zk = new ZooKeeper(connectionString,sessionTimeout,null
});
2、ノードの作成
zk.create("/testRoot", "testRoot".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
を選択します.
説明
CreateMode.PERSISTENT
永続ノード
CreateMode.PERSISTENT_SEQUENTIAL
永続シーケンスノード
CreateMode.EPHEMERAL
セッションが切断または期限切れになったときに削除される一時ノード
CreateMode.PERSISTENT_SEQUENTIAL
セッションが切断または期限切れになったときに削除される一時シーケンスノード
3、ノードの取得
Stat stat = new Stat();
zk.getData("/testRoot",true,stat);
4、ノードデータの修正
// -1
zk.setData("/testRoot", "testRoot_modified".getBytes(), -1);
5、サブノードの作成
zk.create("/testRoot/child1",
"child1_data".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
6、サブノードの取得
List children = zk.getChildren("/testRoot",new Watcher() {
public void process(WatchedEvent event) {
System.out.println("this is children node event");
System.out.println(event);
}
});
注意:getChildrenメソッドは、サブポイントが変化したときにWatcher()というリスナーをトリガーします.
7、ノードの削除
zk.delete("/testRoot", -1);
zk.delete("/testRoot/child1", -1);
8、接続を閉じる
zk.close();
注意:一般的にclose()メソッドはfinallyコードブロックで実行されます.
KeeperErrorCode=ConnectionLossエラーについて
Zookeeper APIを使用すると、接続が完了しないままzookeeperのget/create/exists操作を実行するため、次のエラーが発生することがよくあります.
Exception in thread "main" org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /test
at org.apache.zookeeper.KeeperException.create(KeeperException.Java:99)
at org.apache.zookeeper.KeeperException.create(KeeperException.java:51)
at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1501)
at org.apache.zookeeper.ZooKeeper.exists(ZooKeeper.java:1529)
at com.jiq.test.ZooKeeperTest.main(ZooKeeperTest.java:12)
解決策は、Zookeeper接続の初期化が完了してからインスタンスを使用することです.以下はサンプルコードです.
public static ZooKeeper getInstance() throws IOException, InterruptedException {
//--------------------------------------------------------------
// zookeeper get/create/exists (KeeperErrorCode = ConnectionLoss)
// Zookeeper
//--------------------------------------------------------------
final CountDownLatch connectedSignal = new CountDownLatch(1);
ZooKeeper zk = new ZooKeeper(connectionString, sessionTimeout, new Watcher() {
@Override
public void process(WatchedEvent event) {
if (event.getState() == Event.KeeperState.SyncConnected) {
connectedSignal.countDown();
}
}
});
connectedSignal.await();
return zk;
}
注意:Zookeeperのモニタリングは、getData()、exists()、getChildren()のいくつかのメソッドを使用する場合にのみwatcherがトリガーされます.