目录

一、概述

二、监听单个节点变化

三、监听子节点变化

四、总结


一、概述

curator提供了两种Watcher(Cache)来监听结点的变化。

  • Node Cache : 只是监听某一个特定的节点,监听节点的新增和修改;
  • PathChildren Cache : 监控一个ZNode的子节点. 当一个子节点增加, 更新,删除时, Path Cache会改变它的状态, 会包含最新的子节点,子节点的数据和状态;

二、监听单个节点变化

如果我们需要监听单个节点变化,可以使用NodeCache对象。

NodeCache(CuratorFramework client, String path)

参数说明:

  • client: curator客户端连接对象;
  • path: 需要监听的节点路径;
package com.wsh.zookeeper.zookeeperapidemo.curator;import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.framework.recipes.cache.NodeCacheListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class CuratorWatcherAPI {private static final Logger logger = LoggerFactory.getLogger(CuratorWatcherAPI.class);private static final String ZOOKEEPER_SERVER_ADDRESS = "192.168.179.128:2181,192.168.179.129:2181,192.168.179.133:2181";/*** Curator对象*/private static CuratorFramework curatorFramework;static {//初始化curator对象curatorFramework = CuratorFrameworkFactory.builder()//会话超时时间.sessionTimeoutMs(5000)//服务器集群地址.connectString(ZOOKEEPER_SERVER_ADDRESS)//重试策略.retryPolicy(new ExponentialBackoffRetry(1000, 3))//命名空间.namespace("watcher").build();//开启客户端curatorFramework.start();}/*** 1. 监控单个节点变化* NodeCache(CuratorFramework client, String path)* client: curator客户端连接对象* path: 需要监听的节点路径*/public void watchOneNode() throws Exception {NodeCache nodeCache = new NodeCache(curatorFramework, "/watcher1");//启动监视器nodeCache.start();nodeCache.getListenable().addListener(new NodeCacheListener() {@Overridepublic void nodeChanged() throws Exception {logger.info("节点路径:" + nodeCache.getCurrentData().getPath());logger.info("节点数据:" + new String(nodeCache.getCurrentData().getData()));}});Thread.sleep(50000);//关闭监视器nodeCache.close();}public static void main(String[] args) throws Exception {CuratorWatcherAPI curatorWatcherAPI = new CuratorWatcherAPI();curatorWatcherAPI.watchOneNode();}}

启动程序,使用zkCli.sh连接到zookeeper集群,使用下面的命令创建两个节点:

[zk: localhost:2181(CONNECTED) 38] create /watcher "watcher"
Created /watcher
[zk: localhost:2181(CONNECTED) 39] create /watcher/watcher1 "watcher1"
Created /watcher/watcher1

观察后端日志:

14:00:21.493 [main-EventThread] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 节点路径:/watcher1
14:00:21.493 [main-EventThread] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 节点数据:watcher1114:00:25.321 [main-EventThread] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 节点路径:/watcher1
14:00:25.321 [main-EventThread] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 节点数据:watcher111

可以看到,curator监听到了节点的变化事件,并且这个监听是可以重复进行监听的。

三、监听子节点变化

如果我们需要监听子节点的变化,可以通过构造PathChildrenCache对象实现。

PathChildrenCache(CuratorFramework client, String path, boolean cacheData)

参数说明:

  • client: curator客户端连接对象;
  • path: 监听节点路径;
  • cacheData: 监听事件中是否获取节点数据;
package com.wsh.zookeeper.zookeeperapidemo.curator;import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.*;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class CuratorWatcherAPI {private static final Logger logger = LoggerFactory.getLogger(CuratorWatcherAPI.class);private static final String ZOOKEEPER_SERVER_ADDRESS = "192.168.179.128:2181,192.168.179.129:2181,192.168.179.133:2181";/*** Curator对象*/private static CuratorFramework curatorFramework;static {//初始化curator对象curatorFramework = CuratorFrameworkFactory.builder()//会话超时时间.sessionTimeoutMs(5000)//服务器集群地址.connectString(ZOOKEEPER_SERVER_ADDRESS)//重试策略.retryPolicy(new ExponentialBackoffRetry(1000, 3))//命名空间.namespace("watcher").build();//开启客户端curatorFramework.start();}/*** 2. 监听子节点数据变化* PathChildrenCache(CuratorFramework client, String path, boolean cacheData)* client: curator客户端连接对象* path: 监听节点路径* cacheData: 监听事件中是否获取节点数据*/public void watchChildrenNode() throws Exception {PathChildrenCache pathChildrenCache = new PathChildrenCache(curatorFramework, "watcher1", true);//启动监听器pathChildrenCache.start();pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {@Overridepublic void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {logger.info("事件类型:" + pathChildrenCacheEvent.getType());logger.info("节点路径:" + new String(pathChildrenCacheEvent.getData().getPath()));logger.info("节点数据:" + new String(pathChildrenCacheEvent.getData().getData()));}});Thread.sleep(50000);//关闭监听器pathChildrenCache.close();}public static void main(String[] args) throws Exception {CuratorWatcherAPI curatorWatcherAPI = new CuratorWatcherAPI();curatorWatcherAPI.watchChildrenNode();}}

使用客户端操作节点:

[zk: localhost:2181(CONNECTED) 42] create /watcher/watcher1/node1 "node1"
Created /watcher/watcher1/node1
[zk: localhost:2181(CONNECTED) 43] create /watcher/watcher1/node2 "node2"
Created /watcher/watcher1/node2
[zk: localhost:2181(CONNECTED) 44] set /watcher/watcher1/node1 "node11"
cZxid = 0x500000050
ctime = Tue Dec 29 14:06:31 CST 2020
mZxid = 0x500000052
mtime = Tue Dec 29 14:06:45 CST 2020
pZxid = 0x500000050
cversion = 0
dataVersion = 1
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 6
numChildren = 0
[zk: localhost:2181(CONNECTED) 45] delete /watcher/watcher1/node1

观察后台日志:

14:06:31.361 [PathChildrenCache-0] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 事件类型:CHILD_ADDED
14:06:31.361 [PathChildrenCache-0] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 节点路径:/watcher1/node1
14:06:31.361 [PathChildrenCache-0] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 节点数据:node114:06:36.130 [PathChildrenCache-0] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 事件类型:CHILD_ADDED
14:06:36.130 [PathChildrenCache-0] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 节点路径:/watcher1/node2
14:06:36.130 [PathChildrenCache-0] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 节点数据:node214:06:45.091 [PathChildrenCache-0] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 事件类型:CHILD_UPDATED
14:06:45.091 [PathChildrenCache-0] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 节点路径:/watcher1/node1
14:06:45.091 [PathChildrenCache-0] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 节点数据:node1114:06:55.539 [PathChildrenCache-0] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 事件类型:CHILD_REMOVED
14:06:55.539 [PathChildrenCache-0] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 节点路径:/watcher1/node1
14:06:55.539 [PathChildrenCache-0] INFO com.wsh.zookeeper.zookeeperapidemo.curator.CuratorWatcherAPI - 节点数据:node11

如上,可以看到,curator监听到了子节点的变化事件,并且这个监听也是可以重复进行监听的。

四、总结

本篇文章主要总结curator中监听事件API的使用方法,在实际工作中,监听机制很有用,可以使用在分布式配置的动态感知等场景。

Zookeeeper开源客户端curator watcherAPI的使用相关推荐

  1. Zookeeper详解(三)——开源客户端curator

    开源客户端curator (true re de) curator是Netflix公司开源的一个zookeeper客户端,后捐献给apache,curator框架在zookeeper原生API接口上进 ...

  2. Zookeeper开源客户端Curator之基本功能讲解

    简介 Curator是Netflix公司开源的一套Zookeeper客户端框架.了解过Zookeeper原生API都会清楚其复杂度.Curator帮助我们在其基础上进行封装.实现一些开发细节,包括接连 ...

  3. zookeeper开源客户端Curator介绍(六)

    原文地址,转载请注明出处: https://blog.csdn.net/qq_34021712/article/details/82872311     ©王赛超  上一篇文章 介绍了zookeepe ...

  4. [转载]Zookeeper开源客户端框架Curator简介

    转载声明:http://macrochen.iteye.com/blog/1366136 Zookeeper开源客户端框架Curator简介 博客分类: Distributed Open Source ...

  5. 聊聊、Zookeeper 客户端 Curator

    [Curator]   和 ZkClient 一样,Curator 也是开源客户端,Curator 是 Netflix 公司开源的一套框架. <dependency><groupId ...

  6. Zookeeper客户端Curator使用详解

    http://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端Curator使用详解 简介 Curator是Netflix公司开源的一套zookeeper客户端框 ...

  7. Zookeeper的客户端Curator基本使用

    本文来说下Zookeeper的客户端Curator基本使用 文章目录 Curator概述 Curator包结构 创建会话 使用静态工程方法创建客户端 Fluent风格的Api创建会话 创建包含隔离命名 ...

  8. ZooKeeper客户端Curator的基本使用

    前提:ZooKeeper版本:3.4.14      Curator版本:2.13.0 1.什么是Curator Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Z ...

  9. 【弄nèng - Zookeeper】Zookeeper入门教程(三)—— 客户端Curator的基本API使用(Curator framework)

    文章目录 1. Curator简介 2. Curator framework 3. Curator recipes 4. 基本Api 4.1 创建会话 4.1.1 使用静态工程方法创建 4.1.2 使 ...

  10. Zookeeper实战之客户端Curator vs zkClient

    1. zookeeper应用开发 Zookeeper应用开发,需要使用Zookeeper的java 客户端API ,去连接和操作Zookeeper 集群. 可以供选择的java 客户端API 有:Zo ...

最新文章

  1. ACMNO.42 C语言-第几天 定义一个结构体变量(包括年、月、日)。计算该日在本年中是第几天,注意闰年问题。利用结构体的在最下面
  2. 如何使用Leangoo看板统计中的任务分布?
  3. iPhone应用程序图标 - 精确半径?
  4. 最大字段和_使对易失性字段的操作原子化
  5. Atcoder AGC031C Differ By 1 Bit (构造、二进制)
  6. 入门 | 32 个常用 Python 实现
  7. Java中只有按值传递,没有按引用传递!
  8. python安装成功第三方库但import出问题_解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程...
  9. 爬虫如何监听插件_Go 爬虫之 colly 从入门到不放弃指南
  10. java uipath_10.3 UiPath如何调用Java
  11. Exchange Server 2016管理系列课件46.DAG管理之Powershell创建DAG
  12. Express框架的请求处理~非常详细
  13. linux移植简介[MS2]
  14. python初识(2)
  15. 图解TCPIP---第五章---IP协议相关技术
  16. UE4简单水体使用记录
  17. 【论文阅读】深度学习与多种机器学习方法在不同的药物发现数据集进行对比
  18. 老司机带你检测相似图片【转】
  19. 爆锤数据结构(期末复习笔记)
  20. Alibaba(实习准备)—SOFARPC学习总结

热门文章

  1. linux 软件源码安装教程,linux源码安装软件步骤
  2. TensorFlow进阶:CNN对CIFAR10图像分类
  3. 产品经理训练营:让正确的事情相继发生 开营直播
  4. swift5的下标Subscripts 花式玩法
  5. 算法:动态规划 最大连续子数组和 Maximum Subarray
  6. linux cpu mysql_Linux 指定MySQL服务运行的CPU核心(数)
  7. python 求当前小时前n个小时
  8. python redis模块常用_python redis 模块
  9. python数据模型和各种实用小技巧,保证让你更PYTHONIC
  10. 向量函数具有固定模的充要条件