在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