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();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值