监听器前言
- 本人使用 curator 版本 5+ ,对此版本的监听器做一下小结
- 网上搜索 Zookeeper 的 curator 监听器,大概率会出现一下 3 种监听器
-
NodeCache
:只是监听某一特定节点的数据更新、新增、删除- 节点不存在也可以添加监听器
-
PathChildrenCache
:监听节点的子节点。当子节点增加、更新、删除时,PathCache
会改变它的状态。保存子节点,数据、状态 TreeCache
-
- 使用 curator 版本 5+ 时,发现这些监听器已被弃用,所以使用以下几种监听器
- curator 注册的监听器,不需要考虑 一次性问题
监听器-1
-
可以监听当前节点和子节点(子节点的子节点)的创建、更新、删除
-
事件
NODE_CREATED // 节点创建 NODE_CHANGED // 节点更新 NODE_DELETED // 节点删除
NODE_CREATEE
事件,节点创建会被触发;监听器第一次执行时节点存在也会触发次事件
-
-
使用实例介绍
-
如下
CuratorCache curatorCache = CuratorCache.build(client, "/watcher"); curatorCache.listenable().addListener(new CuratorCacheListener() { @Override public void event(Type type, ChildData childData, ChildData childData1) { if (type.name().equals("NODE_CREATED")) { //--节点创建--// //--第二个参数为null--// } else if (type.name().equals("NODE_CHANGED")) { //--更新--// //--节点第一次赋值,childrenData.getData()为null--// } else { //--删除--// //--第三个参数为null--// } } }); //--开启监听器--// curatorCache.start(); //--关闭监视器--// //curatorCache.close();
-
-
Type type
对象是枚举类型监听事件为:创建、更新、删除
-
源码如下
public static enum Type { NODE_CREATED, NODE_CHANGED, NODE_DELETED; private Type() { } }
-
回调函数参数
public void event(Type type, ChildData childData, ChildData childData1)
- 第一个参数:事件类型(枚举)
- 第二个参数:节点更新前的状态、数据
- 第三个参数:节点更新后的状态、数据
-
回调函数使用注意
- 创建节点时:节点刚被创建,不存在 更新前节点 ,所以第二个参数为
null
- 删除节点时:节点被删除,不存在 更新后节点 ,所以第三个参数为
null
- 节点创建时没有赋予值
create /curator/watcher
只创建节点,在这种情况下,更新前节点 的data
为 null,获取不到更新前节点的数据
- 创建节点时:节点刚被创建,不存在 更新前节点 ,所以第二个参数为
-
使用案例
-
如下
CuratorCache curatorCache = CuratorCache.build(client, "/watcher"); curatorCache.listenable().addListener(new CuratorCacheListener() { @Override public void event(Type type, ChildData childData, ChildData childData1) { if (type.name().equals("NODE_CREATED")) { System.out.println(childData1.getPath() + " 节点被创建"); } else if (type.name().equals("NODE_CHANGED")) { System.out.println(type.name() + " 节点数据修改"); System.out.println(childData.getPath()); if (childData.getData() != null) { System.out.println("修改之前数据" + new String(childData.getData())); } else { System.out.println("节点第一次赋值"); } System.out.println("修改之后数据" + new String(childData1.getData())); } else { System.out.println(childData.getPath() + " 节点删除"); System.out.println(new String(childData.getData())); } } }); curatorCache.start();
-