Zookeeper客户端API之读取子节点内容(九)

朴灿烈づ我的快乐病毒、 2021-09-14 20:26 376阅读 0赞

http://blog.csdn.net/wo541075754/article/details/66967706

本篇博客介绍一下Zookeeper原声API读取节点内容的使用方法。

读取节点内容方法介绍

方法

Zookeeper提供了两个方法来获取节点内容,同步获取和异步获取:

  1. public byte[] getData(String path, boolean watch, Stat stat)
  2. 1
  3. public void getData(final String path, Watcher watcher,
  4. DataCallback cb, Object ctx)
  5. 1
  6. 2

参数说明


































参数 说明
path 指定数据节点的路径,获取该节点下面的子节点
watcher 注册在path上的Watcher。节点变更会通知会向客户端发起通知。
stat 指定数据节点状态信息。传入旧stat,方法执行过程中会将其替换为新stat对象。
watch 表示是否需要注册一个watcher。true:注册默认watcher,false:不需要注册watcher
cb 注册一个异步回调函数
ctx 传递上下文信息

具体案例

同步方法

  1. package com.secbro.learn;
  2. import org.apache.zookeeper.*;
  3. import org.apache.zookeeper.data.Stat;
  4. import java.util.concurrent.CountDownLatch;
  5. /** * 读取节点数据 * Created by zhuzs on 2017/3/27. */
  6. public class TestGetData implements Watcher{
  7. private static CountDownLatch countDownLatch = new CountDownLatch(1);
  8. private static ZooKeeper zooKeeper;
  9. private static Stat stat = new Stat();
  10. public static void main(String[] args) throws Exception{
  11. zooKeeper = new ZooKeeper("127.0.0.1:2181", 5000, new TestGetData());
  12. countDownLatch.await();
  13. String path = "/test-get-data";
  14. zooKeeper.create(path,"123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  15. System.out.println("同步读取节点内容:" + new String(zooKeeper.getData(path,true,stat)));
  16. System.out.println("同步读取Stat:czxid=" + stat.getCzxid()
  17. + ";mzxid=" + stat.getMzxid() + ";version=" + stat.getVersion());
  18. zooKeeper.setData(path,"123".getBytes(),-1);
  19. Thread.sleep(10000);
  20. }
  21. public void process(WatchedEvent event) {
  22. if (Event.KeeperState.SyncConnected == event.getState()) {
  23. if(Event.EventType.None == event.getType() && null == event.getPath()){ // 连接时的监听事件
  24. countDownLatch.countDown();
  25. } else if (event.getType() == Event.EventType.NodeDataChanged){ // 子节点内容变更时的监听
  26. try {
  27. System.out.println("监听获得通知内容:data="
  28. + new String(zooKeeper.getData(event.getPath(),true,stat)));
  29. System.out.println("监听获得通知Stat:czxid=" + stat.getCzxid()
  30. + ";mzxid=" + stat.getMzxid() + ";version=" + stat.getVersion());
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. }
  36. }
  37. }
  38. 1
  39. 2
  40. 3
  41. 4
  42. 5
  43. 6
  44. 7
  45. 8
  46. 9
  47. 10
  48. 11
  49. 12
  50. 13
  51. 14
  52. 15
  53. 16
  54. 17
  55. 18
  56. 19
  57. 20
  58. 21
  59. 22
  60. 23
  61. 24
  62. 25
  63. 26
  64. 27
  65. 28
  66. 29
  67. 30
  68. 31
  69. 32
  70. 33
  71. 34
  72. 35
  73. 36
  74. 37
  75. 38
  76. 39
  77. 40
  78. 41
  79. 42
  80. 43
  81. 44
  82. 45
  83. 46
  84. 47
  85. 48
  86. 49

运行结果:

  1. 同步读取节点内容:123
  2. 同步读取Statczxid=14700;mzxid=14700;version=0
  3. 监听获得通知内容:data=123
  4. 监听获得通知Statczxid=14700;mzxid=14701;version=1
  5. 1
  6. 2
  7. 3
  8. 4

代码的基本逻辑为创建一个临时节点,然后读取临时节点内容,并注册监听,当节点变化(内容变化或版本信息变化),触发监听事件,获取最新的节点信息。

异步方法

  1. package com.secbro.learn;
  2. import org.apache.zookeeper.*;
  3. import org.apache.zookeeper.data.Stat;
  4. import java.util.concurrent.CountDownLatch;
  5. /** * 读取节点数据 * Created by zhuzs on 2017/3/27. */
  6. public class TestGetData implements Watcher{
  7. private static CountDownLatch countDownLatch = new CountDownLatch(1);
  8. private static ZooKeeper zooKeeper;
  9. private static Stat stat = new Stat();
  10. public static void main(String[] args) throws Exception{
  11. zooKeeper = new ZooKeeper("127.0.0.1:2181", 5000, new TestGetData());
  12. countDownLatch.await();
  13. String path = "/test-get-data";
  14. zooKeeper.create(path,"123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
  15. // 异步读取节点内容
  16. zooKeeper.getData(path,true,new MyDataCallback(),null);
  17. zooKeeper.setData(path,"123".getBytes(),-1);
  18. Thread.sleep(10000);
  19. }
  20. public void process(WatchedEvent event) {
  21. if (Event.KeeperState.SyncConnected == event.getState()) {
  22. if(Event.EventType.None == event.getType() && null == event.getPath()){ // 连接时的监听事件
  23. countDownLatch.countDown();
  24. } else if (event.getType() == Event.EventType.NodeDataChanged){ // 子节点内容变更时的监听
  25. try {
  26. System.out.println("监听获得通知内容:data="
  27. + new String(zooKeeper.getData(event.getPath(),true,stat)));
  28. System.out.println("监听获得通知Stat:czxid=" + stat.getCzxid()
  29. + ";mzxid=" + stat.getMzxid() + ";version=" + stat.getVersion());
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }
  35. }
  36. }
  37. class MyDataCallback implements AsyncCallback.DataCallback{
  38. public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {
  39. System.out.println("异步返回结果:rc=" + rc + ";path=" + path + ";data=" + new String(data));
  40. System.out.println("异步读取Stat:czxid=" + stat.getCzxid()
  41. + ";mzxid=" + stat.getMzxid() + ";version=" + stat.getVersion());
  42. }
  43. }
  44. 1
  45. 2
  46. 3
  47. 4
  48. 5
  49. 6
  50. 7
  51. 8
  52. 9
  53. 10
  54. 11
  55. 12
  56. 13
  57. 14
  58. 15
  59. 16
  60. 17
  61. 18
  62. 19
  63. 20
  64. 21
  65. 22
  66. 23
  67. 24
  68. 25
  69. 26
  70. 27
  71. 28
  72. 29
  73. 30
  74. 31
  75. 32
  76. 33
  77. 34
  78. 35
  79. 36
  80. 37
  81. 38
  82. 39
  83. 40
  84. 41
  85. 42
  86. 43
  87. 44
  88. 45
  89. 46
  90. 47
  91. 48
  92. 49
  93. 50
  94. 51
  95. 52
  96. 53
  97. 54
  98. 55
  99. 56
  100. 57
  101. 58

运行结果:

  1. 异步返回结果:rc=0;path=/test-get-data;data=123
  2. 异步读取Statczxid=14704;mzxid=14704;version=0
  3. 监听获得通知内容:data=123
  4. 监听获得通知Statczxid=14704;mzxid=14705;version=1
  5. 1
  6. 2
  7. 3
  8. 4

异步方法与同步方法业务逻辑基本相同,区别点在于将同步获取改为异步获取。

发表评论

表情:
评论列表 (有 0 条评论,376人围观)

还没有评论,来说两句吧...

相关阅读