java中使用zkClient操作zookeeper

本文介绍zkClient库,它封装了Zookeeper的原生API,简化了节点创建、删除、数据读写等操作,并提供了易于使用的监听机制,如订阅子节点变化和数据变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

zkClient在原生API的基础上进行了封装,简化了zookeeper的复杂性。(zookeeper文章所需的jar包

创建客户端方法:ZKClient(Arguments)

参数1:zkServers,zookeeper服务器地址,用“,”分隔。

参数2:sessionTimeout,会话超时时间,单位毫秒,默认为30000ms。

参数3:connectionTimeout,连接超时时间。

参数4:IZkConnection接口的实现类。

参数5:zkSerializer,自定义序列化实现。

 
  1. public class ZkClientBase {

  2. static final String CONNECT_ADDR = "192.168.1.104:2181,192.168.1.105:2181,192.168.1.107:2181";

  3. static final int SESSION_TIMEOUT = 5000;

  4.  
  5. public static void main(String[] args) throws InterruptedException {

  6. ZkClient zkClient = new ZkClient(new ZkConnection(CONNECT_ADDR), SESSION_TIMEOUT);

  7.  
  8. //1.create和delete方法

  9. /*zkClient.createEphemeral("/temp"); //创建临时节点,会话失效后删除

  10. zkClient.createPersistent("/super/c1", true); //创建持久化节点,true表示如果父节点不存在则创建父节点

  11. Thread.sleep(10000);

  12. zkClient.delete("/temp"); //删除节点

  13. zkClient.deleteRecursive("/super"); //递归删除,如果该节点下有子节点,会把子节点也删除

  14. */

  15.  
  16. //2.设置path和data,并读取子节点和每个节点的内容

  17. /*zkClient.createPersistent("/super", "1234"); //创建并设置节点的值

  18. zkClient.createPersistent("/super/c1", "内容一");

  19. zkClient.createPersistent("/super/c2", "内容二");

  20. List<String> children = zkClient.getChildren("/super");

  21. for(String child : children) {

  22. System.out.print(child + ":");

  23. String childPath = "/super/" + child;

  24. String data = zkClient.readData(childPath); //读取指定节点的值

  25. System.out.println(data);

  26. }*/

  27.  
  28. //3.更新和判断节点是否存在

  29. zkClient.writeData("/super/c1", "新内容"); //修改指定节点的值

  30. String cData = zkClient.readData("/super/c1");

  31. System.out.println(cData);

  32. System.out.println(zkClient.exists("/super/c1")); //判断指定节点是否存在

  33.  
  34. zkClient.close();

  35. }

  36. }

 

在以上的代码中,我们可以发现没有与zookeeper原生API中类似Watcher、watch参数,这也就说明使用zkClient,开发人员无需关心反复注册Watcher的问题。zkClient给开发人员提供了一套监听方式,我们可以使用监听节点的方式进行操作,剔除了繁琐的反复Watcher操作,简化了代码的复杂度。

subscribeChildChanges方法(只监听节点的变化):

参数1:path路径

参数2:实现了IZkChildListener接口的类,只需重写handleChildChanges(String parentPath, List<String> currentChilds)方法。其中parentPath为所监听节点的全路径,currentChilds为最新的子节点列表(相对路径)。

IZkClientListener事件针对于下面三个事件触发:

新增子节点、减少子节点、删除节点

 
  1. public class SubscribeChildChanges {

  2. static final String CONNECT_ADDR = "192.168.1.104:2181";

  3. static final int SESSION_TIMEOUT = 50000;

  4.  
  5. public static void main(String[] args) throws InterruptedException {

  6. ZkClient zkClient = new ZkClient(new ZkConnection(CONNECT_ADDR, SESSION_TIMEOUT));

  7. zkClient.subscribeChildChanges("/super", (parentPath, currentChilds) -> {

  8. System.out.println("parentPath:" + parentPath);

  9. System.out.println("currentChilds:" + currentChilds);

  10. });

  11.  
  12. Thread.sleep(3000);

  13. zkClient.createPersistent("/super");

  14. Thread.sleep(1000);

  15. zkClient.createPersistent("/super/c1", "内容一");

  16. Thread.sleep(1000);

  17. zkClient.createPersistent("/super/c2", "内容二");

  18. Thread.sleep(1000);

  19. zkClient.delete("/super/c2");

  20. Thread.sleep(1000);

  21. zkClient.deleteRecursive("/super");

  22. Thread.sleep(Integer.MAX_VALUE);

  23. }

  24. }

 

subscribeDataChanges方法(只监听节点数据的变化):

参数1:path路径

参数2:实现了IZkDataListener接口的类,需要重新handleDataDeleted(String path)方法(节点删除时触发)和handleDataChanges(String path, Object data)方法(节点数据改变时触发)。经测试,该接口只会对所监控的path的数据变化,子节点数据发送变化不会被监控到。

 
  1. public class SubscribeDataChanges {

  2. static final String CONNECT_ADDR = "192.168.1.104:2181";

  3. static final int SESSION_TIMEOUT = 50000;

  4.  
  5. public static void main(String[] args) throws InterruptedException {

  6. ZkClient zkClient = new ZkClient(new ZkConnection(CONNECT_ADDR, SESSION_TIMEOUT));

  7. zkClient.subscribeDataChanges("/super", new IZkDataListener() {

  8. @Override

  9. public void handleDataChange(String s, Object o) throws Exception {

  10. System.out.println("变更节点为:" + s + ",变更数据为:" + o);

  11. }

  12.  
  13. @Override

  14. public void handleDataDeleted(String s) throws Exception {

  15. System.out.println("删除的节点为:" + s);

  16. }

  17. });

  18. zkClient.createPersistent("/super", "123");

  19. Thread.sleep(3000);

  20. zkClient.writeData("/super", "456", -1);

  21. Thread.sleep(1000);

  22. zkClient.createPersistent("/super/c1", "789"); //不会被监控到

  23. zkClient.deleteRecursive("/super");

  24. Thread.sleep(Integer.MAX_VALUE);

  25. }

  26. }

运行结果:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值