Zookeeper 4 Zookeeper JavaAPI 操作 4.7 Curator API 常用操作【Watch 事件监听】

news2024/11/20 15:24:48

Zookeeper

【黑马程序员Zookeeper视频教程,快速入门zookeeper技术】

文章目录

      • Zookeeper
      • 4 Zookeeper JavaAPI 操作
        • 4.7 Curator API 常用操作
          • 4.7.1 Watch 事件监听

4 Zookeeper JavaAPI 操作

4.7 Curator API 常用操作

4.7.1 Watch 事件监听

【基本概念】

ZooKeeper 允许用户在指定节点上注册一些Watcher( 监听器),并且在一些特定事件触发的时候,ZooKeeper 服务端会将事件通知到感兴趣的客户端上去,该机制是 ZooKeeper 实现分布式协调服务的重要特性。

[举个栗子]

在这里插入图片描述

OK, 这里是一个 服务端,三个客户端【3 个应用程序】,他们仨都可以通过 Curator 写代码来操作 服务端

在这里插入图片描述

而下面这张图 就是 Zookeeper 的数据模型中的节点 和信息

观察者模式

ZooKeeper 中引入了Watcher机制来实现了发布/订阅功能能,能够让多个订阅者同时监听某一个对象,当一个对象自身状态变化时,会通知所有订阅者(即上面 图中的应用程序)。

ZooKeeper 原生支持通过注册Watcher来进行事件监听,但是其使用并不是特别方便,需要开发人员自己反复注册Watcher,比较繁琐。

Curator引入了 Cache 来实现对 ZooKeeper 服务端事件的监听。

ZooKeeper提供了三种Watcher:

  • NodeCache : 只是监听某一个特定的节点
  • PathChildrenCache : 监控一个ZNode的子节点.
  • TreeCache : 可以监控整个树上的所有节点,类似于PathChildrenCache和NodeCache的组合

【NodeCache 实现】

复制我们 之前那个测试类

在这里插入图片描述

保留建立连接 和 释放资源的代码

    private CuratorFramework client;

    /**
     * 建立连接
     * */
    @Before
    public void testConnect(){

        //1. 第一种方式
        /*
         * Create a new client
         *
         * @param connectString       list of servers to connect to【连接字符串,zk server的 地址和端口】
         * @param sessionTimeoutMs    session timeout【会话超时时间,单位ms】
         * @param connectionTimeoutMs connection timeout【连接超时时间,单位ms】
         * @param retryPolicy         retry policy to use【重试策略】
         */

        RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000,10);
//        CuratorFramework client = CuratorFrameworkFactory
//                .newClient("43.138.50.253:2181", 60 * 1000, 15 * 1000, retryPolicy);
//
//        //开启连接
//        client.start();

        //2. 第二种方式
        client = CuratorFrameworkFactory.builder()
                .connectString("自己的服务器IP:2181")
                .sessionTimeoutMs(60 * 1000)
                .connectionTimeoutMs(15 * 1000)
                .retryPolicy(retryPolicy)
                .namespace("dingjiaxiong")
                .build();

        //第二种方式开启连接
        client.start();
    }

    @After
    public void close(){

        if (client != null){
            client.close();
        }
    }

编写测试方法

先来个节点

在这里插入图片描述

OK,对它进行监听

/**
 * 演示NodeCache:给指定的一个节点注册监听器
 * */
@Test
public void testNodeCache() throws Exception {

    //1. 创建NodeCache 对象
    NodeCache nodeCache = new NodeCache(client,"/app1");

    //2. 注册监听
    nodeCache.getListenable().addListener(new NodeCacheListener() {
        @Override
        public void nodeChanged() throws Exception {
            System.out.println("节点变化了");
        }
    });

    //3. 开启监听【设置为true,则开启监听时加载 缓冲数据】
    nodeCache.start(true);

    while (true){
        
    }

}

运行

在这里插入图片描述

OK,现在就在 被监听了

现在去 修改一下 /app1 节点的值

在这里插入图片描述

OK, 查看控制台

在这里插入图片描述

没毛病,修改可以 感知到

删除app1 节点

在这里插入图片描述

OK, 删除也会被监听到

创建

在这里插入图片描述

创建也行

现在试试 “获取 变化”

@Test
public void testNodeCache() throws Exception {

    //1. 创建NodeCache 对象
    final NodeCache nodeCache = new NodeCache(client,"/app1");

    //2. 注册监听
    nodeCache.getListenable().addListener(new NodeCacheListener() {
        @Override
        public void nodeChanged() throws Exception {
            System.out.println("节点变化了");

            //获取修改节点后的数据
            byte[] data = nodeCache.getCurrentData().getData();
            System.out.println(new String(data));
        }
    });

    //3. 开启监听【设置为true,则开启监听时加载 缓冲数据】
    nodeCache.start(true);

    while (true){

    }

}

OK, 重新运行这个方法

在这里插入图片描述

OK,这样就行 了

【这就是 对一个节点进行监听 的NodeCache】

【PathChildrenCache】:监控一个ZNode 的子节点

/**
 * 演示PathChildrenCache:监控一个ZNode的子节点.【监听某个节点的所有子节点们】
 * */
@Test
public void testPathChildrenCache() throws Exception {

    

    while (true){

    }

}

直接干

先来一个 app2 节点

在这里插入图片描述

OK

@Test
public void testPathChildrenCache() throws Exception {

    //1. 创建监听对象
    PathChildrenCache pathChildrenCache = new PathChildrenCache(client,"/app2",true);

    //2. 绑定监听器
    pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
        @Override
        public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
            System.out.println("子节点变化了");

            System.out.println(pathChildrenCacheEvent);
        }
    });

    //3. 开启监听
    pathChildrenCache.start();

    while (true){

    }

}

直接运行

在这里插入图片描述

可以看到刚启动,就来了一些东西【意思是 重新建立了 连接 】【这个不是我们 要关心的】

创建一个 app2 的子节点

在这里插入图片描述

OK,事件 类型是 “孩子_添加了”,然后就是 path ,状态信息,数据

给p1 来个值

在这里插入图片描述

这次的事件类型 就是 “孩子_ 修改了”

删除 p1

在这里插入图片描述

没毛病

试试给app2 自己来个值

在这里插入图片描述

OK, 它感知不到

[来个 小练习]

监听子节点的变更,并且拿到变更后的数据

@Test
public void testPathChildrenCache() throws Exception {

    //1. 创建监听对象
    PathChildrenCache pathChildrenCache = new PathChildrenCache(client,"/app2",true);

    //2. 绑定监听器
    pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
        @Override
        public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
            System.out.println("子节点变化了");
            System.out.println(pathChildrenCacheEvent);

            // 1. 获取类型
            PathChildrenCacheEvent.Type type = pathChildrenCacheEvent.getType();

            //2. 判断类型是否是update
            if (type.equals(PathChildrenCacheEvent.Type.CHILD_UPDATED)){

                byte[] data = pathChildrenCacheEvent.getData().getData();
                System.out.println(new String(data));
            }
        }
    });

    //3. 开启监听
    pathChildrenCache.start();

    while (true){

    }

}

OK, 直接启动测试

创建p2

在这里插入图片描述

OK, 监听到 子节点变化了, 但是并不是更新,所以没有通过if 判断,修改一下 p2 的数据

在这里插入图片描述

没毛病

【这就是PathChildrenCache,注意的是它只能感知到 “儿子“们 的变化,不能感知到 自己的】

【还有最后一个 TreeCahe】:可以监控整个树上的所有节点,类似于PathChildrenCache和NodeCache的组合

直接试试

/**
 * 演示TreeCache : 可以监控整个树上的所有节点,类似于PathChildrenCache和NodeCache的组合【监听某个节点自己和所有子节点们】
 * */
@Test
public void testTreeCache() throws Exception {

    

    while (true){

    }

}

OK

在这里插入图片描述

就监听 app2 吧

/**
 * 演示TreeCache : 可以监控整个树上的所有节点,类似于PathChildrenCache和NodeCache的组合【监听某个节点自己和所有子节点们】
 * */
@Test
public void testTreeCache() throws Exception {
    //1. 创建监听器
    TreeCache treeCache = new TreeCache(client,"/app2");

    //2. 注册监听
    treeCache.getListenable().addListener(new TreeCacheListener() {
        @Override
        public void childEvent(CuratorFramework curatorFramework, TreeCacheEvent treeCacheEvent) throws Exception {
            System.out.println("节点变化了");

            System.out.println(treeCacheEvent);
        }
    });

    //3. 开启监听
    treeCache.start();

    while (true){

    }

}

直接启动

在这里插入图片描述

当然这些 都是缓存信息,不看’

修改 app2 自己的数据

在这里插入图片描述

修改儿子 p1

在这里插入图片描述

OK,也监听到了

【这就是 TreeCache】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/110448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

异常见闻录-Java.lang.UnsupportedClassVersionError涨知识啦

今天有学生说自己的Eclipse的Java代码只能在新建的项目中运行,运行导入项目中类就报错 异常信息 java.lang.UnsupportedClassVersionError: com/demo1/Demo1Application has been compiled by a more recent version of the Java Runtime (class file version 5…

CMake入门

1. CMake的介绍: 当多人开发同一个项目时,最终要输出一个可执行文件或者共享库(dll、so等),就可以使用cmake了 所有操作都是通过 CMakeLists.txt(严格区分大小写) 来完成的 ----> 简单 2. …

C51——超声波测距 函数封装和舵机代码结合

要注意舵机转动中 延时函数要放在哪里 #include "reg52.h" sbit D5 P3^7;// sbit D6 P3^6;// sbit Trig P1^5; sbit Echo P1^6; sbit sg90_con P1^1; int cnt; int jd; double time; void Delay10us() //11.0592MHz { unsigned ch…

操作系统管程-地址-重定位-内存管理与存储管理

管程的基本概念:为什么会出现管程?信号量机制的不足:程序编写困难、易出错解决:Brinch Hansen(1973)Boare(1974)方案:在程序设计语言中引入管程成分一种高级同步机制管程的定义:是一个特殊的模块有一个名字…

使用MAXScript脚本编写圣诞树建模插件教程

一、前言 2022年圣诞节到来啦,很高兴这次我们又能一起度过~ 今年的圣诞节为大家分享用MAXScript脚本编写圣诞树建模插件的技术创意,喜欢的同学别忘记在下面点个赞! 二、创意名 一键圣诞树插件 三、效果展示 四、实现步骤 1.制作圣诞树的设计稿…

智能巡检系统:企业安全生产管理的智能助手

智能巡检是一种高效代替传统人工巡检的新方式,其依靠物联感知技术,通过物联网采集获取信息,自动记录巡检信息,及时发现问题,实现巡检科学化。 工业4.0带来的技术革新加速了企业的转型升级进程,传统企业的运…

F5张振伦:让应用安全、快速、可靠地交付到需要的地方丨2022首届全球数字生态大会

科技云报道原创。 日前,由杭州市人民政府和浙江省商务厅主办的“2022首届全球数字生态大会”在杭州国际博览中心成功举办。 本次大会以“新技术、新业态、新模式”为主题,邀请到国内外20余位演讲嘉宾和超300位专业观众线下参会。 与此同时,…

IB成绩换成GPA,美国大学是如何算的?

IB课程体系是全球公认的难度大、结构强的课程体系。 IB课程可以通过IB文凭课程(也称为IBDP)进行系统研究。IB课程体系是国际公认的基础文凭,世界上几乎所有大学都认可IB课程体系。这是否意味着IB在申请美国大学时会有优势? 事实上…

【vue系列-02】vue的核心属性,数据代理,事件

vue的核心属性一,vue的核心属性1,模板语法1.1,插值语法1.2,指令语法2,数据绑定2.1,单向绑定2.2,双向绑定3.mvvm模型4,数据代理4.1,数据代理的基本使用4.2,数据…

pytorch实现好莱坞明星识别

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍦 参考文章地址: 365天深度学习训练营-第P6周:好莱坞明星识别🍖 作者:K同学啊一、前期准备 1.设置GPU import torch from torch import nn …

获取rdp保存的凭证

获取用户保存的rdp凭证 当获取到一台windows服务器,可以尝试获取本地远程连接的信息,如果用户在登入rdp时勾选了 允许为我保存凭证的选项,则在该用户本地会生成一个凭证文件,我们只需要破解该凭证文件即可获取其明文密码。 通过注…

[含文档+PPT+源码等]基于SSM框架图书借阅管理系统开发与设计

博主介绍:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 [含文档PPT源码等]基于SSM框架图书借阅管理系统开发与设计 系统介绍 《基于SSM框架图书管理系统开发与设计》 该项目含有源码、配套开发软件、软件安…

元数据相关的术语,你知道几个?

元数据被认为是数据治理的基石,但关于元数据相关的概念,很多人不是那么清楚,今天就和大家详解元数据相关的术语。当然,与元数据相关的概念非常多,以下仅罗列几个常见的。 01 元数据 1.名词解释 元数据最简单的定义…

【关于时间序列的ML】项目 7 :使用机器学习进行每日出生预测

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

u盘无法识别如何修复?恢复U盘,建议尝试下这些方法

我们基本都有使用过U盘,也都遇到过U盘损坏的问题。u盘无法识别如何修复?有没有什么实用的方法呢?来看看这篇文章,简单几步,就可以修复成功。如果在操作过程中,遇到数据丢失,也有方法帮你恢复&am…

ASP.NET开发的医疗健康咨询平台源码 养生知识咨询 寻根问药平台源码 C#源码

一、源码特点: 爱心医生健康知识门户网站是一个权威的医疗科普视频、语音、知识、医疗健康问答平台。 包含所有源代码和数据库,可以直接部署到IIS中使用。 二、菜单功能 网站页面: 1、首页:包含幻灯片。 2…

MySQL面试常问问题(SQL 优化 ) —— 赶快收藏

目录 1.慢SQL如何定位呢? 2.有哪些方式优化慢SQL? 避免不必要的列 分页优化 索引优化 JOIN优化 排序优化 UNION优化 3.怎么看执行计划(explain),如何理解其中各个字段的含义? 1.慢SQL如何定位呢&a…

基于python开发的DIY宠物桌面系统(附源码)--可自定义修改

定制你的宠物桌面 最近想要做一个自己独一无二的桌面宠物,可以直接使用python来自己订制。属于一个小项目,这个教程主要包含几个步骤: 准备需要的动图素材 规划自己需要的功能 使用python的PyQt5订制功能 在这个教程中,我主要…

Apache Flink 任务 Tasks 和任务槽 Task Slots

目录 任务槽(Task Slots) 任务槽数量的设置 任务对任务槽的共享 任务槽和并行度的关系 任务槽(Task Slots) Flink 中每一个 worker(也就是 TaskManager)都是一个 JVM 进程,它可以启动多个独立的线程,来并…

【数据结构】详解队列和循环队列

目录一.队列1.队列的概念及结构2.队列的实现Queue.hQueue.c二.循环队列1.循环队列的实现2.设计循环队列解题思路代码一.队列 1.队列的概念及结构 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出…