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

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