在Zookeeper節點操作-1使用了同步返回,這裏舉幾個節點操作回調接口的函數。
在這篇裏添加了NodeChildrenChanged事件,該事件是對節點下的子節點的創建和刪除進行監聽。
注意事項:臨時節點下不能創建子節點
package ghs.zook;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
public class ZooKeeperTest implements Watcher{
public static final String CONNECTION_STR = "10.1.1.165:2181,10.1.1.165:2182,10.1.1.165:2183";
public static final int SESSION_TIME_OUT = 5000;
private CountDownLatch latch = new CountDownLatch(1);
public static final String ROOT = "/zk-root";
private ZooKeeper zk = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ZooKeeperTest zooTest = new ZooKeeperTest();
zooTest.createConnection();
if(zooTest.exists(ROOT) == null) {
zooTest.createNode(ROOT, "zk-root",CreateMode.PERSISTENT);
}
String aPath = ROOT+"/aaa";
if(zooTest.exists(aPath) == null) {
zooTest.createNode(aPath, "aaa",CreateMode.PERSISTENT);
}
// else{
// zooTest.deleteNode(path);
// }
String bPath = ROOT+"/aaa/bbb";
if(zooTest.exists(aPath) !=null){//父節點不能爲空,同時給b的父節點註冊事件
//要註冊NodeChildrenChanged的事件,必須使用getChildren()
zooTest.zk.getChildren(aPath,true);
if(zooTest.exists(bPath) == null) {
zooTest.createNode(bPath, "bbb",CreateMode.PERSISTENT);
}else{
zooTest.deleteNode(bPath);
}
}
TimeUnit.MINUTES.sleep(10);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//catch (KeeperException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// } catch (InterruptedException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
/**
* 節點刪除
* @param path
*/
public void deleteNode(String path){
Object ctx = null;
this.zk.delete(path, -1, new AsyncCallback.VoidCallback(){
public void processResult(int rc, String path, Object ctx) {
System.out.println("刪除節點path="+path+"回調結果:rc="+rc
+",ctx="+ctx);
}
}, ctx);
}
/**
* 節點判斷是否存在
* @param path
* @return
*/
public Stat exists(String path){
try {
return this.zk.exists(path,true);
} catch (KeeperException e) {
e.printStackTrace();
return null;
} catch (InterruptedException e) {
e.printStackTrace();
return null;
}
}
/**
* 連接服務器
*/
public void createConnection(){
try {
zk = new ZooKeeper(CONNECTION_STR,SESSION_TIME_OUT, this);
latch.await();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 創建節點
* @param path
* @param data
* @param createMode
*/
public void createNode(String path,String data,CreateMode createMode){
this.zk.create(path,//節點路徑
data.getBytes(),//節點數據
ZooDefs.Ids.OPEN_ACL_UNSAFE,//權限限制
createMode,
new AsyncCallback.StringCallback(){
public void processResult(int rc, String path, Object ctx, String name) {
System.out.println("創建節點path="+path+"回調結果:rc="+rc
+",ctx="+ctx
+",name="+name);
}
},null);
}
public void process(WatchedEvent event) {
// TODO Auto-generated method stub
System.out.println("event:"+event);
if(Event.KeeperState.SyncConnected.equals(event.getState())
&& event.getType().equals(Event.EventType.None)){
System.out.println("連接到服務器成功,event:"+event);
this.latch.countDown();
}else if(Event.EventType.NodeCreated.equals(event.getType())){
System.out.println("節點創建成功,event:"+event);
}else if(Event.EventType.NodeDeleted.equals(event.getType())){
System.out.println("節點刪除成功,event:"+event);
}else if(Event.EventType.NodeDataChanged.equals(event.getType())){
System.out.println("節點數據變更成功,event:"+event);
}else if(Event.EventType.NodeChildrenChanged.equals(event.getType())){
System.out.println("子節點刪除或創建成功,event:"+event);
}else if(Event.EventType.DataWatchRemoved.equals(event.getType())){
System.out.println("節點監聽事件刪除,event:"+event);
}else if(Event.EventType.ChildWatchRemoved.equals(event.getType())){
System.out.println("子節點監聽事件刪除,event:"+event);
}
}
}
運行第一次結果:
event:WatchedEvent state:SyncConnected type:None path:null
連接到服務器成功,event:WatchedEvent state:SyncConnected type:None path:null
event:WatchedEvent state:SyncConnected type:NodeCreated path:/zk-root/aaa/bbb
節點創建成功,event:WatchedEvent state:SyncConnected type:NodeCreated path:/zk-root/aaa/bbb
event:WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/zk-root/aaa
子節點刪除或創建成功,event:WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/zk-root/aaa
創建節點path=/zk-root/aaa/bbb回調結果:rc=0,ctx=null,name=/zk-root/aaa/bbb
第二次結果:
event:WatchedEvent state:SyncConnected type:None path:null
連接到服務器成功,event:WatchedEvent state:SyncConnected type:None path:null
event:WatchedEvent state:SyncConnected type:NodeDeleted path:/zk-root/aaa/bbb
節點刪除成功,event:WatchedEvent state:SyncConnected type:NodeDeleted path:/zk-root/aaa/bbb
event:WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/zk-root/aaa
子節點刪除或創建成功,event:WatchedEvent state:SyncConnected type:NodeChildrenChanged path:/zk-root/aaa
刪除節點path=/zk-root/aaa/bbb回調結果:rc=0,ctx=null