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>
		

官网介绍
image

创建CuratorCache

在新版本中使用NodeCache中发现被标记为过时,但是有替代的CuratorCache可以使用
image

点进CuratorCache后发现里面提供了静态方法创建
image

对于option的选择可以根据具体业务来定
image

CuratorCacheListener

1.使用lambda 创建

image

由于CuratorCacheListener是函数式接口,在使用时可以直接用lambda 表达式

参数使用
image
olddata 和 data 表示为新旧数据,都是可以为空的
type:表示事件类型
image

2.使用CuratorCacheListenerBuilder创建

看了下源码发现创建方式还是挺多的,可以指定类型

例如
只监听节点创建
image

只监听节点更新
image

只监听该节点变化
image

监听节点下子节点的变化
image

监听该节点和子节点的变化
image

注册监听器

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

posted @ 2022-04-13 15:41  原来是晴天啊  阅读(534)  评论(0编辑  收藏  举报