zookeeper學習筆記--建立節點
阿新 • • 發佈:2018-11-20
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 |
節點型別,是一個列舉型別,通常四種可選型別:
|
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,服務端響應碼,用來判斷呼叫結果,常見響應碼如下:
|
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);
}
}