Zookeeper Java APIの使用

8364 ワード

Zookeeper Java APIの使用について説明します
対応するJarパッケージを導入
  • bulidPath解凍ダウンロードzookeeper-3.4.9.tar.gzのルートディレクトリにはjar
  • があります.
    zookeeper-3.4.9.jar

    eclipseのbuildPathにzookeeper-3.4.9.jarを導入
  • mavenが構築したプロジェクトがmavenが構築したプロジェクトであれば、以下の依存
  • を加える.
    <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
    });
  • connectionStringは、クラスタの場合に使用する接続情報です.
  • sessionTimeoutとは、セッションの有効期限を指し、その値minSessionTimeoutはtickTimeの最小2倍、最大値maxSessionTimeoutはtickTimeの20倍である.入力値がこの範囲で実際に機能しない場合でも、minSessionTimeoutからmaxSessionTimeoutまでの
  • です.
    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がトリガーされます.