Zookeeper节点操作-2

在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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章