getChildren

在 ZkClient中,可以通过以下API来获取指定节点的子节点列表:

List<String> getChildren(String path)

ZkClient只提供了一个对外API,用于获取指定节点的子节点列表。这个API的返回值是子节点的相对路径,例如,ZooKeeper服务器上存在/zk-book/c1和/zk-book/c2这样两个节点,那么调用该API获取/zk-book的子节点列表,返回值是[c1, c2]。

和ZooKeeper原生API相比, ZkClient提供 的API没有了Watcher注册的功能。在获取子节点列表这个接口上,可以通过如下API来进行注册监听:

LIst<String> subscribeChanges(String path, IZkChildListener listener)

通过该API的调用,就完成了事件监听的注册。从API方法中,我们可以看出,注册的是对子节点列表的监听,也就是说,一旦子节点列表发生变更,ZooKeeper服务端就会向客户端发出事件通知,由这个Listener来处理。下面给出这个Listener接口的定义:

public interface IZkChildListener {

public void handleChildCHange(String parentPath, List<String> currentChilds) throws Exception;

}

在这个接口定义中,只有一个接口方法handleChildChange,用来处理服务端发送过来的事件通知。该API方法的参数说明如下表所示。

参数名 说明
parentPath 子节点变更通知对应的父节点的节点路径
currentChilds 子节点的相对路径列表,如果没有子节点,那么会传入null

如果客户端对指定节点nodeA注册了IZkChildListener监听,那么将会接收到如下表所示的事件通知。

事件类别 说明
新增子节点 指定节点nodeA新增子节点。此时在handleChildChange方法中,parentPath收到的是nodeA的全路径,currentChilds是最新的子节点列表(相对路径)
减少子节点 指定节点nodeA减少子节点。此时在handleChildChange方法中,parentPath收到的是nodeA的全路径,currentChilds是最新的子节点列表(相对路径),可能是null
删除节点nodeA 指定节点nodeA被删除。此时在handleChildChange方法中,parentPath收到的是nodeA的全路径,currentChilds是null

下面,我们通过实际代码来看看getChildren接口以及子节点列表变更监听的使用方式。

// 使用 ZkClient获取子节点列表

public class Get_Children_Sample {

public static void main(String[] args) throws Exception {

String path = "/zk-book";

ZkClient zkClient = new  ZkClient("domain1.book.zookeeper:2181", 5000);

zkClient.subscribeChildChanges(path, new IZkChildListener() {

public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {

System.out.println(parentPath + " 's child changed, currentChilds:" + currentChilds);

}

});

zkClient.createPersistent(path);

Thread.sleep(1000);

System.out.println(zkClient.getChildren(path));

Thread.sleep(1000);

zkClient.createPersistent(path + "/c1");

Thread.sleep(1000);

zkClient.delete(path + "/c1");

Thread.sleep(1000);

zkClient.delete(path);

Thread.sleep(Integer.MAX_VALUE);

}

}

运行程序,输出结果如下:

在上面这个示例程序中,首先对/zk-book注册了IZkChildListener监听,此时该节点并不存在。当创建了/zk-book节点后,客户端立即会收到来自服务端的事件通知,当然此时接收到的子节点列表为null。然后继续创建节点/zk-book/c1,此时客户端就会收到子节点列表变更通知,同时收到最新的子节点列表为[c1]。随后,我们删除了/zk-book/c1节点,客户端同样会收到事件变更通知。最后,当将/zk-book节点本身删除的时候,客户端受到了事件通知,同时可以发现,此时子节点列表为null。

从上面的示例程序和输出结果中,我们可以得出以下3个结论。

  • 客户端可以对一个不存在的节点进行子节点变更的监听。
  • 一旦客户端对一个节点注册了子节点列表变更监听之后,那么当该节点的子节点列表发生变更的时候,服务端都会通知客户端,并将最新的子节点列表发送给客户端。
  • 该节点本身的创建或删除也会通知到客户端。
另外,还需要明确的一点是,和ZooKeeper原生提供的Watcher不同的是, ZkClient的LIstener不是一次性的,客户端只需要注册一次就会一直生效。

getData

在ZkClient中,可以通过以下API来获取指定节点的数据内容:
<T extends Object> T readData(String path)
<T extends Object> T readData(String path, boolean returnNullIfPathNotExists)
<T extends Object> T readData(String path, Stat stat)
该API方法的参数说明如下表所示。
参数名 说明
returnNullIfPathNotExists 默认情况下,在调用该API的时候,如果指定的节点不存在,那么会抛出异常:org.apache.zookeeper.KeeperException&NoNodeException。如果设置了这个参数,那么如果节点不存在,就直接返回null,而不会抛出异常
stat 指定数据节点的节点状态信息。用法是在接口中传入一个旧的stat变量,该stat变量会在方法执行过程中,被来自服务端响应的新stat对象替换

通过调用这个接口,就可以获取指定节点的数据内容。注意,方法的返回值,在ZkClient内部已经被反序列化成指定对象。

另外,该接口对服务端事件的监听,同样是通过注册指定的Listener来实现的:

public interface IZkDataListener {

public void handleDataChange(String dataPath, Object data) throws Exception;

public void handleDataDeleted(String dataPath) throws Exception;

}

在这个Listener接口中,有两个接口方法handleDataChange和handleDataDeleted,用于处理服务端发来的两类事件通知,分别为“节点内容变更”和“节点删除”事件。该API方法的参数说明如下表所示。

参数名 说明
dataPath 事件通知对应的节点路径
data 最新的数据内容

如果客户端对指定节点nodeA注册了IZkDataListener监听,那么将会接收到如下表所示的来自服务端的事件通知。

事件类型 说明
节点数据变化 指定节点nodeA的数据内容(content)或是数据版本(version)发生变更,都会触发这个事件。此时在handleDataChange方法中,dataPath收到的是nodeA的全路径,data是最新的数据节点内容
删除节点nodeA 指定节点nodeA被删除。此时在handleDataDeleted方法中,dataPath收到的是nodeA的全路径

下面,我们通过实际代码来看看getData接口以及子节点列表变更监听的使用方式。

// 使用ZkClient获取节点数据内容

public class Get_Data_Sample {

public static void main(String[] args) throws Exception {

String path = "/zk-book";

ZkClient zkClient = new  ZkClient("domain1.book.zookeeper:2181", 5000);

zkClient.createEphemeral(path, "123");

zkClient.subscribeDataChanges(path, new IZkDataListener() {

public void handleDataChange(String parentPath) throws Exception {

System.out.println("Node " + dataPath + " deleted.");

}

public void handleDataChange(String dataPath, Object data) throws Exception {

System.out.println("Node " + dataPath + "changed, new data:" + data);

}

});

System.out.println(zkClient.readData(path));

zkClient.writeData(path, "456");

Thread.sleep(1000);

zkClient.delete(path);

Thread.sleep(Integer.MAX_VALUE);

}

}

运行程序,输出结果如下:

在上面这个示例程序中,首先创建了节点/zk-book,并且调用readData接口来获取其数据内容,同时在该节点上注册了IZkDataListener监听,实现对该节点数据变更的监听。这样一来,之后凡是该节点数据变化或是该节点被删除,服务端都会向客户端发出事件通知。

ZkClient之读取数据。相关推荐

  1. Linux从mysql中读取数据_linux shell中读写操作mysql数据库

    本文介绍了如何在shell中读写mysql数据库.主要介绍了如何在shell 中连接mysql数据库,如何在shell中创建数据库,创建表,插入csv文件,读取mysql数据库,导出mysql数据库为 ...

  2. 《Clojure数据分析秘笈》——1.6节从JDBC数据库读取数据

    本节书摘来自华章社区<Clojure数据分析秘笈>一书中的第1章,第1.6节从JDBC数据库读取数据,作者(美)Eric Rochester,更多章节内容可以访问云栖社区"华章社 ...

  3. 多线程不重复读取数据_用 PHP 实现多线程编程

    (给PHP开发者加星标,提升PHP技能) 转自:腾讯云(枕边书) cloud.tencent.com/developer/article/1012783 1.前言 前些天帮同事查一个问题,第一次接触到 ...

  4. cdatabase读取excel第一行数据_“蟒蛇”py对Excel的读取——数据操作用它,老板都得重新认识你...

    在python自动化中,经常会遇到对数据文件的操作,比如添加多名员工,但是直接将员工数据写在python文件中,不但工作量大,要是以后再次遇到类似批量数据操作还会写在python文件中吗? 应对这一问 ...

  5. VC++中从txt文本中读取数据并且存到二维数组中

    这几天因为在做作业,所以不仅会想到这一类有关的问题.现在我需要实现的是讲txt文件的数据读取出来并且存储到一个二维数组中.,首先为了对待什么样的矩阵我们都可以读取,我们就要设置一个动态的矩阵,这样当我 ...

  6. vc++从txt文件中读取数据

    数值分析课上老师说要将数据写在txt文件上,然后让程序从txt文件中读取数据.让本来C++已经遗忘了很久的我们无从下手,在网上也查看了很多,发现大多都是扯淡,放在VC++编辑器上发现并不能运行,不知道 ...

  7. pandas使用read_csv读取数据使用skiprows参数跳过指定的数据行但保留表头、pandas使用to_csv函数将dataframe保存为gzip压缩文件

    pandas使用read_csv读取数据使用skiprows参数跳过指定的数据行但保留表头.pandas使用to_csv函数将dataframe保存为gzip压缩文件 目录

  8. PyTorch手把手自定义Dataloader读取数据

    PyTorch手把手自定义Dataloader读取数据 https://zhuanlan.zhihu.com/p/35698470 pytorch之dataloader深入剖析 https://www ...

  9. TensorFlow高效读取数据的方法

    概述 最新上传的mcnn中有完整的数据读写示例,可以参考. 关于Tensorflow读取数据,官网给出了三种方法: 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Pytho ...

最新文章

  1. 据说看完这21个故事的人,30岁前都成了亿万富翁。你是下一个吗?
  2. Docker 公司是如何做社区的?
  3. [20150710]11G谓词推入问题2.txt
  4. python的web抓取_python实现从web抓取文档的方法
  5. SQLServer全文检索无内容
  6. data后缀文件解码_对任何格式的文件实现加密与解密软件
  7. nuxt 低版本浏览器不兼容处理
  8. 安装Server2003+SQL2000+SQL2000SP4
  9. 通过减小Bootstrapping Error Reduction来进行离线RL学习
  10. JS 字符串截取切割操作汇总
  11. Excel 自动计算房贷、月供 (附模板)
  12. 对 torch 中 dim 的总结和理解
  13. python的学习笔记案例1--汇率兑换5.0
  14. 花1分钟用Word手动绘制流程图,看完我学会了!
  15. android虚拟按键趋势,为什么Android虚拟按键老被吐槽但却有厂商坚持在做?
  16. 华为设备VRRP多VLAN负载分担
  17. actuator--基础--6.1--端点解析--health端点
  18. 【第五章】 C语言之牛客网刷题笔记 【点进来保证让知识充实你一整天】
  19. 天下文章一大抄看你会抄不会抄devGridView凭证金额录入(万仟百拾元)
  20. 微信小程序Uncaught (in promise) undefined解决方案

热门文章

  1. linux下的tar压缩解压缩命令详解,Linux下的tar压缩解压缩命令详解
  2. 电影网站站架构(第一版)
  3. 什么是产品操作手册?企业该怎样制作产品操作手册页面?
  4. oracle 银行家舍入,四舍五入
  5. 洛咕P3250 [HNOI2016]网络 整体二分
  6. R 数据分析方法(梅长林)exercise1-3
  7. 微信公众号开发 https访问的封装
  8. 网易互娱游戏研发面经及答案:C++基础
  9. .net5项目集成百度富文本编辑器umeditor最全教程(含源码)
  10. Java日志体系学习2--日志门面JCLSlf4j