Zookeeper循环注册监听器

Zookeeper中的监听器只执行一次,需要在watcher类中重写process方法,以达到重复注册监听器的效果



MyWatcher.java

package watch;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

public class MyWatcher implements Watcher{
	private ZooKeeper zk=null;
	public MyWatcher() {
		// TODO Auto-generated constructor stub
	}
	public MyWatcher(ZooKeeper zk) {
		this.zk=zk;
	}
	public void setZk(ZooKeeper zk) {
		this.zk = zk;
	}

	@Override
	public void process(WatchedEvent event) {
		String path=event.getPath();
		KeeperState state = event.getState();
		EventType type = event.getType();
		System.out.println("监听中"+path+"\t"+state+"\t"+type);
		try {
			Stat stat=zk.exists(path, true);
			zk.getData(path, true, stat);
			//zk.getChildren(path, true);//用了参数就可以不断循环监听
		} catch (KeeperException | InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

}

WatchDemo.java

package watch;

import org.apache.zookeeper.ZooKeeper;

/**
 * 监听器 不断添加
 * */
public class WatchDemo {
	private static ZooKeeper zk=null;
	public static void main(String[] args) throws Exception {
		MyWatcher watcher=new MyWatcher();
		zk=new ZooKeeper("hadoop02:2199", 5000, watcher);
		watcher.setZk(zk);
		
		String path="/aa/dd";//选择要监听的目录
		zk.getChildren(path, true);
		int count=1;
		while(count<6){
			zk.setData(path, (count+"").getBytes(), -1);//因为监听器是getChildren的 所以只能监听子节点数目变化
			//zk.create(path+"/"+count, (count+"").getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
			Thread.sleep(4000);
			count++;
		}
		zk.close();
	}
}

你可能感兴趣的:(大数据)