ZooKeeper(四)-- 第三方客户端 ZkClient的使用

前言

zkClient主要做了两件事情:

  • 一件是在session loss和session expire时自动创建新的ZooKeeper实例进行重连。

  • 另一件是将一次性watcher包装为持久watcher。后者的具体做法是简单的在watcher回调中,重新读取数据的同时再注册相同的watcher实例。

zkClient目前已经运用到了很多项目中,知名的有Dubbo、Kafka、Helix。

zkClient jar包下载,或者直接添加maven依赖: http://mvnrepository.com/artifact/com.101tec/zkclient

正文

直接上代码:

1.测试类  


   
   
  1. package com.xbq.demo;

  2. import java.io.IOException;

  3. import org.I0Itec.zkclient.ZkClient;

  4. import org.I0Itec.zkclient.IZkDataListener;

  5. /**

  6. * @ClassName: ZkClientDemo

  7. * @Description: TODO(zkClient 测试)

  8. * @author xbq

  9. * @date 2017-3-26 上午11:49:39

  10. */

  11. public class ZkClientDemo {

  12. // 此demo使用的集群,所以有多个ip和端口

  13. private static String CONNECT_SERVER = "192.168.99.138:2181,192.168.99.138:2182,192.168.99.138:2183";

  14. private static int SESSION_TIMEOUT = 3000;

  15. private static int CONNECTION_TIMEOUT = 3000;

  16. private static ZkClient zkClient ;

  17. static {

  18. zkClient = new ZkClient(CONNECT_SERVER, SESSION_TIMEOUT,CONNECTION_TIMEOUT,new MyZkSerializer());

  19. }

  20. public static void main(String[] args) {

  21. add(zkClient);

  22. // update(zkClient);

  23. // delete(zkClient);

  24. // addDiGui(zkClient);

  25. // deleteDiGui(zkClient);

  26. // subscribe(zkClient);

  27. }

  28. /**

  29. * @Title: add

  30. * @Description: TODO(增加一个指定节点)

  31. * @param @param zkClient 设定文件

  32. * @return void 返回类型

  33. * @throws

  34. */

  35. public static void add(ZkClient zkClient){

  36. // 如果不存在节点,就新建一个节点

  37. if(!zkClient.exists("/config")){

  38. zkClient.createPersistent("/config","javaCoder");

  39. }

  40. // 查询一下,看是否增加成功

  41. String value = zkClient.readData("/config");

  42. System.out.println("value===" + value);

  43. }

  44. /**

  45. * @Title: addSequential

  46. * @Description: TODO(递归创建节点)

  47. * @param @param zkClient 设定文件

  48. * @return void 返回类型

  49. * @throws

  50. */

  51. public static void addDiGui(ZkClient zkClient){

  52. // 递归创建节点

  53. zkClient.createPersistent("/xbq/java/coder", true);

  54. if(zkClient.exists("/xbq/java/coder")){

  55. System.out.println("增加成功!");

  56. }else {

  57. System.out.println("增加失败!");

  58. }

  59. }

  60. /**

  61. * @Title: delete

  62. * @Description: TODO(删除指定节点)

  63. * @param @param zkClient 设定文件

  64. * @return void 返回类型

  65. * @throws

  66. */

  67. public static void delete(ZkClient zkClient){

  68. // 存在节点才进行删除

  69. if(zkClient.exists("/config")){

  70. boolean flag = zkClient.delete("/config");

  71. System.out.println("删除" + (flag == true ? "成功!" : "失败!"));

  72. }

  73. }

  74. /**

  75. * @Title: deleteDiGui

  76. * @Description: TODO(递归删除)

  77. * @param @param zkClient 设定文件

  78. * @return void 返回类型

  79. * @throws

  80. */

  81. public static void deleteDiGui(ZkClient zkClient){

  82. // 存在节点才进行删除

  83. if(zkClient.exists("/xbq")){

  84. // 递归删除的时候 只传入 父节点就可以,如果传入 全部的节点,虽然返回的是true,但是依然是没有删除的,

  85. // 因为zkClient将异常封装好了,进入catch的时候,会返回true,这是一个坑

  86. boolean flag = zkClient.deleteRecursive("/xbq");

  87. System.out.println("删除" + (flag == true ? "成功!" : "失败!"));

  88. }

  89. }

  90. /**

  91. * @Title: update

  92. * @Description: TODO(修改节点的值)

  93. * @param @param zkClient 设定文件

  94. * @return void 返回类型

  95. * @throws

  96. */

  97. public static void update(ZkClient zkClient){

  98. if(zkClient.exists("/config")){

  99. zkClient.writeData("/config", "testUpdate");

  100. // 查询一下,看是否修改成功

  101. String value = zkClient.readData("/config");

  102. System.out.println("value===" + value);

  103. }

  104. }

  105. /**

  106. * @Title: subscribe

  107. * @Description: TODO(事件订阅, 可用于配置管理)

  108. * 先订阅,再 操作增删改。(可多个 客户端订阅)

  109. * @param @param zkClient 设定文件

  110. * @return void 返回类型

  111. * @throws

  112. */

  113. public static void subscribe(ZkClient zkClient){

  114. zkClient.subscribeDataChanges("/config/userName", new IZkDataListener() {

  115. @Override

  116. public void handleDataDeleted(String arg0) throws Exception {

  117. System.out.println("触发了删除事件:" + arg0);

  118. }

  119. @Override

  120. public void handleDataChange(String arg0, Object arg1) throws Exception {

  121. System.out.println("触发了改变事件:" + arg0 + "-->" + arg1);

  122. }

  123. });

  124. try {

  125. System.in.read();

  126. } catch (IOException e) {

  127. e.printStackTrace();

  128. }

  129. }

  130. }

2.自定义序列化类


   
   
  1. package com.xbq.demo;

  2. import org.I0Itec.zkclient.exception.ZkMarshallingError;

  3. import org.I0Itec.zkclient.serialize.ZkSerializer;

  4. import java.io.UnsupportedEncodingException;

  5. /**

  6. * @ClassName: MyZkSerializer

  7. * @Description: TODO(实现序列化接口,转为UTF-8编码)

  8. * @author xbq

  9. * @date 2017-3-26 上午11:56:22

  10. */

  11. public class MyZkSerializer implements ZkSerializer{

  12. @Override

  13. public byte[] serialize(Object data) throws ZkMarshallingError {

  14. try {

  15. return String.valueOf(data).getBytes("UTF-8");

  16. } catch (UnsupportedEncodingException e) {

  17. e.printStackTrace();

  18. }

  19. return null;

  20. }

  21. @Override

  22. public Object deserialize(byte[] bytes) throws ZkMarshallingError {

  23. try {

  24. return new String(bytes, "UTF-8");

  25. } catch (UnsupportedEncodingException e) {

  26. e.printStackTrace();

  27. }

  28. return null;

  29. }

  30. }

源码下载

点击阅读原文下载源码哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值