zookeeper-监听节点信息
watch 事件监听
用户可以在zookeeper 的指定节点上注册watcher , 并在一些特定事件触发的时候,zookeeper服务端会将事件通知到感兴趣的客户端上去
zookeeper通过watcher 机制来实现了发布订阅功能,可以放多个订阅者监听同一个对象,当被监听对象发生改变时会通知所有订阅者
watcher 类型(旧版本 For preZooKeeper 3.6.x):
nodeCache: 只监听特定的结点
pathChildrenCache: 监听一个ZNode 的子节点
treeCache: nodeCache 和 pathChildrenCache的组合
watcher 类型(新版本):
CuratorCache
CuratorCacheListener
依赖
<!-- 包含了zookeeper 客户端的基本使用 创建删除节点 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<!-- 包含了zookeeper 所有内容 包含(curator-framework) lock watcher -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
官网介绍
创建CuratorCache
在新版本中使用NodeCache中发现被标记为过时,但是有替代的CuratorCache可以使用
点进CuratorCache后发现里面提供了静态方法创建
对于option的选择可以根据具体业务来定
CuratorCacheListener
1.使用lambda 创建
由于CuratorCacheListener是函数式接口,在使用时可以直接用lambda 表达式
参数使用
olddata 和 data 表示为新旧数据,都是可以为空的
type:表示事件类型
2.使用CuratorCacheListenerBuilder创建
看了下源码发现创建方式还是挺多的,可以指定类型
例如
只监听节点创建
只监听节点更新
只监听该节点变化
监听节点下子节点的变化
监听该节点和子节点的变化
注册监听器
curatorCache.listenable().addListener(listener);
启用
curatorCache.start();
样例代码
/**
*
* @desc: 监听节点变化 这是监听节点的所有变化
*/
public void nodeCache(String nodePath) {
CuratorCache curatorCache = CuratorCache.build(client, nodePath);
// CuratorCacheListenerBuilder builder = CuratorCacheListener.builder();
curatorCache.listenable().addListener((new CuratorCacheListener() {
@Override
public void event(Type type, ChildData oldData, ChildData data) {
// 节点变化类型
// old data 旧数据 可以为null
// data 新数据 可以为null
}
}));
curatorCache.start();
// curatorCache.listenable().addListener();
}
/**
*
* @desc: 监听该节点下子节点变化
*/
public void nodeChildCache(String path) {
CuratorCache curatorCache = CuratorCache.build(client, path);
CuratorCacheListenerBuilder builder = CuratorCacheListener.builder();
CuratorCacheListener listener = builder.forPathChildrenCache(path, client, new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework client, PathChildrenCacheEvent event) throws Exception {
// 添加操作
}
}).build();
curatorCache.listenable().addListener(listener);
curatorCache.start();
}
/**
*
* @desc: 监听该节点和该节点下子节点变化
*/
public void treeNodeCache(String path) {
CuratorCache curatorCache = CuratorCache.build(client, path);
CuratorCacheListenerBuilder builder = CuratorCacheListener.builder();
CuratorCacheListener listener = builder.forTreeCache(client, new TreeCacheListener() {
@Override
public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
// 操作
}
}).build();
curatorCache.listenable().addListener(listener);
curatorCache.start();
}