1. 程式人生 > >zookeeper學習筆記--建立節點

zookeeper學習筆記--建立節點

1:客戶端可以通過ZK的API來建立資料節點,有如下兩個介面:

同步方式

String Create(final String path,  byte data[],  List<ACL> acl,  CreateMode createmode)

非同步方式

void Create(final String path,  byte data[],  List<ACL> acl,  CreateMode createmode,  StringCallback cb,  Object ctx)

注意:

  • ZK不支援遞迴建立,即無法在父節點不存在的情況下建立子節點。
  • ZK節點資料型別只支援位元組陣列型別(byte[]),也就是ZK不負責為節點內容進行序列化和反序列化。

2:引數說明:

path

需要建立的資料節點路徑,如:/zk/foo

data[]

一個位元組陣列,節點建立後的初始內容

acl

節點的ACL策略

createmode

節點型別,是一個列舉型別,通常四種可選型別:

  • 持久(PERSISTENT)
  • 持久順序(PERSISTENT_SEQUENTIAL)
  • 臨時(EPHEMERAL)
  • 臨時順序(EPHEMERAL_SEQUENTIAL)

cb

註冊一個非同步回撥函式,開發人員需要實現StringCallback介面,主要對下面這個方法重寫: 

void processResult(int rc,  String path,  Object ctx,  String name)

當服務端節點建立完畢後,zk客戶端會自動回撥這個方法,這樣就可以自動處理相關業務了。

ctx 

用於傳遞一個物件,可以在回撥方法執行的時候使用,通常是放一個上下文資訊

 

void processResult(int rc,  String path,  Object ctx,  String name)引數說明:

rc

result code,服務端響應碼,用來判斷呼叫結果,常見響應碼如下:

  • 0   介面呼叫成功
  • -4 客戶端和服務端斷開連線
  • -110 指定節點已存在
  • -112 會話已過期

path

介面呼叫時傳入API的資料節點的節點路徑引數值

ctx

介面呼叫時傳入API的ctx引數值

name

實際在服務端建立的節點名

程式碼示例

package LearningZK;

import java.util.concurrent.CountDownLatch;

import org.apache.zookeeper.*;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;

public class UsingZookeeperAPI implements Watcher{

    private static CountDownLatch connectedSemaphore = new CountDownLatch(1);

    public static void main(String[] args) throws Exception{

        /*使用ZK構造方法例項化ZK物件來建立會話*/
        /*new UsingZookeeperAPI 實現watcher介面,重寫process方法,處理服務端返回的非同步通知*/
        ZooKeeper zookeeper = new ZooKeeper("127.0.0.1:2181",
                5000,
                new UsingZookeeperAPI());

        System.out.println(zookeeper.getState());
//        long sessionID = zookeeper.getSessionId();     //獲取會話ID
//        byte[] sessionPasswd = zookeeper.getSessionPasswd(); //獲取會話金鑰
        try {
            connectedSemaphore.await();
        } catch (InterruptedException e) {}
        System.out.println("ZooKeeper session established.");

        /*以同步的方式建立ZK臨時節點*/
        String path1 = zookeeper.create("/ZK_test", "".getBytes(),Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        System.out.println("Create Znode Success:"+path1);

        /*以同步的方式建立ZK臨時順序節點*/
        String path2 = zookeeper.create("/ZK_test","".getBytes(),Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
        System.out.println("Create Znode Succsess:"+path2);

        /*以非同步的方式建立ZK臨時節點*/
        zookeeper.create("/ZK_test_async", "".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL, new AsyncCallBack(), "I am content");
        Thread.sleep(Integer.MAX_VALUE);
    }

    /*處理ZK服務端watcher通知,再接收到服務端發來的SyncConnected通知後,解除主程式的等待阻塞*/
    public void process(WatchedEvent event) {
        System.out.println("Receive watched event:" + event);
        if (KeeperState.SyncConnected == event.getState()) {
            connectedSemaphore.countDown();
        }
    }
}


class AsyncCallBack implements AsyncCallback.StringCallback{
    public void processResult(int rc,  String path,  Object ctx,  String name){
        System.out.println("Create path result:["+rc+","+path+","+ctx+",real path name"+name);
    }
}