Zookeeper原生支持通过注册Watcher来进行事件监听,但是每次在使用完后都是需要重新进行注册,十分繁琐不方便开发者使用,curator引入了Cache实现了对Zookeeper服务端事件的鉴定,Cache对Zookeeper的 事件监听的包装,能够自动实现为开发人员处理反复注册监听,从而简化了原生API开发的繁琐过程,Cache分为两分两类监听类型:节点监听和子节点监听。下面我们就看下分别如何实现监听。
1、NodeCache用于监听节点本身的变化,下面使用NodeCache对节点自身变化监听实现
static String connectString = "localhost:xxxx";
// 创建zk连接
static CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString(connectString)
.connectionTimeoutMs(5000)
.retryPolicy(new ExponentialBackoffRetry(1000, 3))
.sessionTimeoutMs(5000)
.build();
public static void main(String[] args) throws Exception {
client.start();
client.create().creatingParentsIfNeeded()
.withMode(CreateMode.EPHEMERAL)
.forPath("/zookper/zk", "kk".getBytes()); // 创建临时节点
final NodeCache nodeCache = new NodeCache(client, "/zookper/zk",false);
nodeCache.start(true);
nodeCache.getListenable().addListener(new NodeCacheListener() {
@Override
public void nodeChanged() throws Exception {
String data = new String(nodeCache.getCurrentData().getData());
System.out.println(data); // 获取变化后节点的内容
}
});
String currentData = new String(nodeCache.getCurrentData().getData());
System.out.println(currentData); // 获取当前节点的内容
Thread.sleep(1000);
client.setData().forPath("/zookper/zk", "itke".getBytes()); // 修改节点内容
Thread.sleep(1000);
client.delete().forPath("/zookper/zk"); // 删除节点
Thread.sleep(1000);
}
2、PathChildrenCache用于监听制定的Zookeeper数据节点的子节点变化情况。
public static void main(String[] args) throws Exception {
client.start();
PathChildrenCache pathChildrenCache = new PathChildrenCache(client, "/zookper", true);
pathChildrenCache.start(StartMode.POST_INITIALIZED_EVENT);
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework arg0, PathChildrenCacheEvent event) throws Exception {
switch(event.getType()) {
case CHILD_ADDED :
System.out.println("add point! " + event.getData()); // 新增节点
break;
case CHILD_UPDATED :
System.out.println("add update! " + event.getData()); // 节点修改
break;
case CHILD_REMOVED :
System.out.println("add remove! " + event.getData()); // 节点删除
break;
}
}
});
client.create().creatingParentsIfNeeded()
.withMode(CreateMode.EPHEMERAL)
.forPath("/zookper/test1", "nihao".getBytes());
Thread.sleep(1000);
client.setData().forPath("/zookper/test1", "test01".getBytes());
Thread.sleep(1000);
client.close();
Thread.sleep(1000);
}