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