Curator实现zookeeper的节点监听详解

 更新时间:2023年12月18日 10:23:13   作者:暴躁的程序猿啊  
这篇文章主要介绍了Curator实现zookeeper的节点监听详解,Curtor框架中一共有三个实现监听的方式,一种是NodeCache监听指定节点,一种是pathChildrenCache监听子节点,一种是TreeCache可以监控所有节点 相当于以上两种的合集,需要的朋友可以参考下

Curator实现zookeeper的节点监听

Curtor框架中一共有三个实现监听的方式 一种是NodeCache监听指定节点 一种是pathChildrenCache监听子节点 一种是TreeCache可以监控所有节点 相当于以上两种的合集

引入依赖

        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-client</artifactId>
            <version>4.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.3.0</version>
        </dependency>

创建一个测试类 连接好客户端

public class CuratorTest {
    private CuratorFramework curatorFramework;
    @Before
    public void testCreate() {
        ExponentialBackoffRetry retry = new ExponentialBackoffRetry(2, 10);
        curatorFramework = CuratorFrameworkFactory.builder()
                .connectString("127.0.0.1:2181")
                .connectionTimeoutMs(60 * 1000)
                .sessionTimeoutMs(15 * 10000)
                .retryPolicy(retry).build();
        curatorFramework.start();
    }
   @After
    public void close() {
        if (curatorFramework != null) {
            curatorFramework.close();
        }
    }
}

Watch监听之NodeCache

监听一个指定节点

 @Test
    public void testUpdate() throws Exception {
        //监听一个节点
        NodeCache nodeCache = new NodeCache(curatorFramework,"/dongwuyuan");
        //注册监听
        nodeCache.getListenable().addListener(new NodeCacheListener() {
            @Override
            public void nodeChanged() throws Exception {
                System.out.println("节点变化了!!!!");
            }
        });
        //开启监听 参数 如果设置为true 则开启监听时加载缓存数据
        nodeCache.start(true);
        while (true){
        }
    }
set /dongwuyuan "laohu"

在这里插入图片描述

Watch监听之PathChildrenCache

监听子节点的变化

 @Test
    public void testPathChildrenCache() throws Exception {
        // 参数  客户端,路径 ,缓存数据,是否压缩,线程池
        PathChildrenCache pathChildrenCache = new PathChildrenCache(curatorFramework,"/dongwuyuan",true);
        //绑定监听器
        pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
            @Override
            public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
                System.out.println("子节点变化了");
                System.out.println(pathChildrenCacheEvent);
                //监听子节点的变更,并且拿到变更后的数据
                PathChildrenCacheEvent.Type type = pathChildrenCacheEvent.getType();
                //判断类型是否是update
                if(type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
                     //拿到数据
                    byte[] data = pathChildrenCacheEvent.getData().getData();
                    System.out.println(data);
                }
            }
        });
        //开启监听
        pathChildrenCache.start();
        while (true){
        }
    }

watch监听之TreeCache

  /**
     * TreeCache:监听节点自己和所有子节点们
     */
    @Test
    public void testTreeCache(){
        //1.创建监听器
        TreeCache treeCache = new TreeCache(curatorFramework, "/dongwuyuan");
        //2.注册监听
        treeCache.getListenable().addListener(new TreeCacheListener() {
            @Override
            public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
                System.out.println("节点变化了");
                System.out.println(event);
            }
        });
        //开启监听
        try {
            treeCache.start();
            while (true){
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
[zk: localhost:2181(CONNECTED) 13] delete /dongwuyuan/node1

在这里插入图片描述

[zk: localhost:2181(CONNECTED) 15] set /dongwuyuan/node2  "shizi"

在这里插入图片描述

完整代码

public class CuratorTest {
    private CuratorFramework curatorFramework;
    @Before
    public void testCreate() {
        ExponentialBackoffRetry retry = new ExponentialBackoffRetry(2, 10);
        curatorFramework = CuratorFrameworkFactory.builder()
                .connectString("127.0.0.1:2181")
                .connectionTimeoutMs(60 * 1000)
                .sessionTimeoutMs(15 * 10000)
                .retryPolicy(retry).build();
        curatorFramework.start();
    }
    @Test
    public void testUpdate() throws Exception {
        //监听一个节点
        NodeCache nodeCache = new NodeCache(curatorFramework,"/dongwuyuan");
        //注册监听
        nodeCache.getListenable().addListener(new NodeCacheListener() {
            @Override
            public void nodeChanged() throws Exception {
                System.out.println("节点变化了!!!!");
            }
        });
        //开启监听 参数 如果设置为true 则开启监听时加载缓存数据
        nodeCache.start(true);
        while (true){
        }
    }
    @Test
    public void testPathChildrenCache() throws Exception {
        // 参数  客户端,路径 ,缓存数据,是否压缩,线程池
        PathChildrenCache pathChildrenCache = new PathChildrenCache(curatorFramework,"/dongwuyuan",true);
        //绑定监听器
        pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
            @Override
            public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
                System.out.println("子节点变化了");
                System.out.println(pathChildrenCacheEvent);
                //监听子节点的变更,并且拿到变更后的数据
                PathChildrenCacheEvent.Type type = pathChildrenCacheEvent.getType();
                //判断类型是否是update
                if(type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){
                     //拿到数据
                    byte[] data = pathChildrenCacheEvent.getData().getData();
                    System.out.println(data);
                }
            }
        });
        //开启监听
        pathChildrenCache.start();
        while (true){
        }
    }
    /**
     * TreeCache:监听节点自己和所有子节点们
     */
    @Test
    public void testTreeCache(){
        //1.创建监听器
        TreeCache treeCache = new TreeCache(curatorFramework, "/dongwuyuan");
        //2.注册监听
        treeCache.getListenable().addListener(new TreeCacheListener() {
            @Override
            public void childEvent(CuratorFramework client, TreeCacheEvent event) throws Exception {
                System.out.println("节点变化了");
                System.out.println(event);
            }
        });
        //开启监听
        try {
            treeCache.start();
            while (true){
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @After
    public void close() {
        if (curatorFramework != null) {
            curatorFramework.close();
        }
    }
}

到此这篇关于Curator实现zookeeper的节点监听详解的文章就介绍到这了,更多相关zookeeper节点监听内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot使用@ControllerAdvice全局异常处理

    SpringBoot使用@ControllerAdvice全局异常处理

    这篇文章主要介绍了SpringBoot使用@ControllerAdvice全局异常处理,异常处理是非常重要的一部分,它可以帮助我们捕获并处理应用程序中出现的异常情况,提高应用程序的健壮性和可靠性,需要的朋友可以参考下
    2023-07-07
  • Java中的ReentrantLock使用解析

    Java中的ReentrantLock使用解析

    这篇文章主要介绍了Java中的ReentrantLock使用解析,ReentrandLock即可重入锁,可重入锁解决的是重入锁定的问题,重入锁定指的是当一个线程执行逻辑时,需要两次获取锁,而该锁不可重入就会导致内部嵌套无法获取锁导致Reentrance Lockout发生,需要的朋友可以参考下
    2023-11-11
  • 解决kafka消息堆积及分区不均匀的问题

    解决kafka消息堆积及分区不均匀的问题

    这篇文章主要介绍了解决kafka消息堆积及分区不均匀的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringBoot QQ邮箱发送邮件实例代码

    SpringBoot QQ邮箱发送邮件实例代码

    大家好,本篇文章主要讲的是SpringBoot QQ邮箱发送邮件实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Java 中FastJson的基本使用

    Java 中FastJson的基本使用

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。下面通过本文给大家介绍Java 中FastJson的基本使用,需要的朋友参考下吧
    2017-11-11
  • Java 最重要布局管理器GridBagLayout的使用方法

    Java 最重要布局管理器GridBagLayout的使用方法

    GridBagLayout是java里面最重要的布局管理器之一,可以做出很复杂的布局,可以说GridBagLayout是必须要学好的的,需要的朋友可以了解下
    2012-12-12
  • springboot过滤器和拦截器的实例代码

    springboot过滤器和拦截器的实例代码

    这篇文章主要介绍了springboot过滤器和拦截器的实例代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • SpringBoot使用slf4j日志并输出到文件中的操作方法

    SpringBoot使用slf4j日志并输出到文件中的操作方法

    这篇文章主要介绍了SpringBoot使用slf4j日志并输出到文件中,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • struts2的流程和一系列相关知识代码解析

    struts2的流程和一系列相关知识代码解析

    这篇文章主要介绍了struts2的流程和一系列相关知识代码解析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • javaweb中Http协议详解

    javaweb中Http协议详解

    HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。这篇文章主要为大家详细介绍了javaweb中的Http协议,感兴趣的小伙伴们可以参考一下
    2016-05-05

最新评论