ZooKeeper Watcher 机制
- client 向zookeeper 注册监听
- client注册的同时会存储一个WatchManager对象
- 向zookeeper发生改变则notification client 并发送一个WatchManager对象,然后client再更新该对象
package com.jacky.zk.demo;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
import java.util.List;
/*
* 使用监听器
* */
public class Get_child {
public static void main(String[] args) throws InterruptedException {
// 获取到zkClient
final ZkClient zkClient= new ZkClient("127.0.0.1:2181");
// zkClient 对指定目录进行监听(不存在的目录)
/*
ps: 可以监听的事件类型:
NodeCreated:当ZNode被创建时触发。
NodeDeleted:当ZNode被删除时触发。
NodeDataChanged:当ZNode的数据内容发生改变时触发。
NodeChildrenChanged:当ZNode的子节点列表发生更改时触发(添加或删除子节点)。
ConnectionStateChanged:与ZooKeeper服务器的连接状态发生变化时触发。
* */
zkClient.subscribeChildChanges("/zk-jk", new IZkChildListener() {
// 回调
@Override
public void handleChildChange(String s, List<String> children) throws Exception {
System.out.println("error"+children);
}
});
zkClient.createPersistent("/zk-jk");
Thread.sleep(2000);
zkClient.createPersistent("/zk-jk/cls-jk");
Thread.sleep(2000);
zkClient.deleteRecursive("/zk-jk/cls-jk");
Thread.sleep(2000);
zkClient.delete("/zk-jk");
Thread.sleep(Integer.MAX_VALUE);
}
}