查看PDF版本

转载请注明:@ni掌柜 nileader@gmail.com

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务框架,包含一组简单的原语集合。通过这些原语言的组合使用,能够帮助我们解决更高层次的分布式问题,关于ZooKeeper的典型使用场景,请查看这个文章《ZooKeeper典型使用场景一览》

本文主要针对ZooKeeper提供的Java API,通过实际代码讲述如何使用API。

  1. package com.taobao.taokeeper.research.sample;
  2. import java.io.IOException;
  3. import java.util.concurrent.CountDownLatch;
  4. import org.apache.zookeeper.CreateMode;
  5. import org.apache.zookeeper.KeeperException;
  6. import org.apache.zookeeper.WatchedEvent;
  7. import org.apache.zookeeper.Watcher;
  8. import org.apache.zookeeper.Watcher.Event.KeeperState;
  9. import org.apache.zookeeper.ZooDefs.Ids;
  10. import org.apache.zookeeper.ZooKeeper;
  11. import common.toolkit.java.util.ObjectUtil;
  12. /**
  13. * ZooKeeper Java Api 使用样例<br>
  14. * ZK Api Version: 3.4.3
  15. *
  16. * @author nileader/nileader@gmail.com
  17. */
  18. public class JavaApiSample implements Watcher {
  19. private static final int SESSION_TIMEOUT = 10000;
  20. private static final String CONNECTION_STRING = "test.zookeeper.connection_string:2181";
  21. private static final String ZK_PATH = "/nileader";
  22. private ZooKeeper zk = null;
  23. private CountDownLatch connectedSemaphore = new CountDownLatch( 1 );
  24. /**
  25. * 创建ZK连接
  26. * @param connectString  ZK服务器地址列表
  27. * @param sessionTimeout   Session超时时间
  28. */
  29. public void createConnection( String connectString, int sessionTimeout ) {
  30. this.releaseConnection();
  31. try {
  32. zk = new ZooKeeper( connectString, sessionTimeout, this );
  33. connectedSemaphore.await();
  34. } catch ( InterruptedException e ) {
  35. System.out.println( "连接创建失败,发生 InterruptedException" );
  36. e.printStackTrace();
  37. } catch ( IOException e ) {
  38. System.out.println( "连接创建失败,发生 IOException" );
  39. e.printStackTrace();
  40. }
  41. }
  42. /**
  43. * 关闭ZK连接
  44. */
  45. public void releaseConnection() {
  46. if ( !ObjectUtil.isBlank( this.zk ) ) {
  47. try {
  48. this.zk.close();
  49. } catch ( InterruptedException e ) {
  50. // ignore
  51. e.printStackTrace();
  52. }
  53. }
  54. }
  55. /**
  56. *  创建节点
  57. * @param path 节点path
  58. * @param data 初始数据内容
  59. * @return
  60. */
  61. public boolean createPath( String path, String data ) {
  62. try {
  63. System.out.println( "节点创建成功, Path: "
  64. + this.zk.create( path, //
  65. data.getBytes(), //
  66. Ids.OPEN_ACL_UNSAFE, //
  67. CreateMode.EPHEMERAL )
  68. + ", content: " + data );
  69. } catch ( KeeperException e ) {
  70. System.out.println( "节点创建失败,发生KeeperException" );
  71. e.printStackTrace();
  72. } catch ( InterruptedException e ) {
  73. System.out.println( "节点创建失败,发生 InterruptedException" );
  74. e.printStackTrace();
  75. }
  76. return true;
  77. }
  78. /**
  79. * 读取指定节点数据内容
  80. * @param path 节点path
  81. * @return
  82. */
  83. public String readData( String path ) {
  84. try {
  85. System.out.println( "获取数据成功,path:" + path );
  86. return new String( this.zk.getData( path, false, null ) );
  87. } catch ( KeeperException e ) {
  88. System.out.println( "读取数据失败,发生KeeperException,path: " + path  );
  89. e.printStackTrace();
  90. return "";
  91. } catch ( InterruptedException e ) {
  92. System.out.println( "读取数据失败,发生 InterruptedException,path: " + path  );
  93. e.printStackTrace();
  94. return "";
  95. }
  96. }
  97. /**
  98. * 更新指定节点数据内容
  99. * @param path 节点path
  100. * @param data  数据内容
  101. * @return
  102. */
  103. public boolean writeData( String path, String data ) {
  104. try {
  105. System.out.println( "更新数据成功,path:" + path + ", stat: " +
  106. this.zk.setData( path, data.getBytes(), -1 ) );
  107. } catch ( KeeperException e ) {
  108. System.out.println( "更新数据失败,发生KeeperException,path: " + path  );
  109. e.printStackTrace();
  110. } catch ( InterruptedException e ) {
  111. System.out.println( "更新数据失败,发生 InterruptedException,path: " + path  );
  112. e.printStackTrace();
  113. }
  114. return false;
  115. }
  116. /**
  117. * 删除指定节点
  118. * @param path 节点path
  119. */
  120. public void deleteNode( String path ) {
  121. try {
  122. this.zk.delete( path, -1 );
  123. System.out.println( "删除节点成功,path:" + path );
  124. } catch ( KeeperException e ) {
  125. System.out.println( "删除节点失败,发生KeeperException,path: " + path  );
  126. e.printStackTrace();
  127. } catch ( InterruptedException e ) {
  128. System.out.println( "删除节点失败,发生 InterruptedException,path: " + path  );
  129. e.printStackTrace();
  130. }
  131. }
  132. public static void main( String[] args ) {
  133. JavaApiSample sample = new JavaApiSample();
  134. sample.createConnection( CONNECTION_STRING, SESSION_TIMEOUT );
  135. if ( sample.createPath( ZK_PATH, "我是节点初始内容" ) ) {
  136. System.out.println();
  137. System.out.println( "数据内容: " + sample.readData( ZK_PATH ) + "\n" );
  138. sample.writeData( ZK_PATH, "更新后的数据" );
  139. System.out.println( "数据内容: " + sample.readData( ZK_PATH ) + "\n" );
  140. sample.deleteNode( ZK_PATH );
  141. }
  142. sample.releaseConnection();
  143. }
  144. /**
  145. * 收到来自Server的Watcher通知后的处理。
  146. */
  147. @Override
  148. public void process( WatchedEvent event ) {
  149. System.out.println( "收到事件通知:" + event.getState() +"\n"  );
  150. if ( KeeperState.SyncConnected == event.getState() ) {
  151. connectedSemaphore.countDown();
  152. }
  153. }
  154. }

输出结果:

  1. 收到事件通知:SyncConnected
  2. 节点创建成功, Path: /nileader, content: 我是节点初始内容
  3. 获取数据成功,path:/nileader
  4. 数据内容: 我是节点初始内容
  5. 更新数据成功,path:/nileader, stat: 42950186407,42950186408,1350820182392,1350820182406,1,0,0,232029990722229433,18,0,42950186407
  6. 获取数据成功,path:/nileader
  7. 数据内容: 更新后的数据
  8. 删除节点成功,path:/nileader

【ZooKeeper Notes 3】ZooKeeper Java API 使用样例相关推荐

  1. 14.ZooKeeper Java API 使用样例

    转自:http://www.aboutyun.com/thread-7332-1-1.html 1 package com.taobao.taokeeper.research.sample; 2 3 ...

  2. chatgpt api请求样例

    chatgpt去年刚出来时我就到openai注册了账号,必须用国外的线路才能注册,正常注册不了, 注册完要用国外手机接收验证码,才能使用,我卡到验证码就没继续用了, 昨晚,找了几个国内的镜像,用了一番 ...

  3. 简单的Java代码测试样例设计

    简单的Java代码测试样例设计 函数一 public static int findLast(int[] x, int y) {for (int i = x.length - 1; i > 0; ...

  4. zookeeper入门学习之java api会话建立《四》

    在上一篇zk中简单玩了下api的连接创建会话,也总是留下了很多坑,就是那些引申开来,搞不明白的问题.有时候想追究起来,问题总是那么无穷无尽,有时候问题比答案更有力度吧,到最后都是些哲学问题吗?存在的这 ...

  5. java设计模式演示样例

    创建模式 1.工厂方法模式(Factory Method)  将程序中创建对象的操作,单独出来处理,创建一个产品的工厂接口,把实际的工作转移到详细的子类.大大提高了系统扩展的柔性,接口的抽象化处理给相 ...

  6. java 内存泄漏样例_一次线上Java应用内存泄漏分析实例

    由于JVM的内存管理采用GC垃圾自动回收机制,这使得Java程序员在编程的时候确实可以从内存管理中释放出来,但这也引发了另外一个大问题,一旦Java应用出现内存泄漏的时候,常常让人措手不及,陷入无从下 ...

  7. 一个优雅的后端API接口样例和代码实现方案

    前言 在移动互联网,分布式.微服务盛行的今天,现在项目绝大部分都采用的微服务框架,前后端分离方式,(题外话:前后端的工作职责越来越明确,现在的前端都称之为大前端,技术栈以及生态圈都已经非常成熟:以前后 ...

  8. java监听器演示样例

    监听器的原理是观察者模式.就像明星(事件源)聚拢了一群粉丝(观察者).当明星有啥举动的时候会通过粉丝们报道出去. 订阅信息.计算器button都是该原理的应用. 以下写了一个监听器的小样例: pack ...

  9. dataTables中文文档API和样例

    2019独角兽企业重金招聘Python工程师标准>>> http://blog.codepiano.com/pages/jquery-datatables-config-cn.htm ...

最新文章

  1. 【PHP】微信官方代码Log调试输出类,面向对象设计模式!来看看,你会有收益!...
  2. CornerEigenValsAndVecs函数
  3. mysql 删除原理_MySQL权限原理及删除MySQL的匿名账户
  4. Visual Studio 2010 and .NET Framework 4 Beta 1
  5. Fibonacci递归非递归方法
  6. vue-cli使用swiper4在ie以及safari报错
  7. 海龟绘图小动物_被解救海龟经野化训练后放归大海,这一幕让人惊叹不已
  8. linux导出表数据dmp,导出表的部分数据到dmp文件中
  9. 【论文笔记】激光里程计网络 LO-Net:Deep Real-time Lidar Odometry2019
  10. bjui给出的一个标准应用的首页
  11. 计算机组成第六章作业,计算机组成原理第六章作业_计算机的运算方法1
  12. Java 垃圾回收器G1介绍
  13. python怎么学比较快,怎样快速学会python
  14. 图像大小调整_如何在Windows中调整图像和照片的大小
  15. LigerUI视频教程_基于LigerUI前端技术实现的管理平台
  16. JAVA 生成二维码并保存到本地或文件服务器
  17. 你在加密市场能走多远 取决于你的思维认知
  18. 聊聊C++任务定时器的设计与具体实现
  19. HTML在网页上不能显示图片问题
  20. 电脑连接到手机并安装手机驱动usb-driver

热门文章

  1. C#调用存储过程简单完整例子
  2. 如何实现可以带详细表格的DropDownList
  3. Asp.net支持的最大上传文件大小
  4. Linux socket 网络编程 常用头文件
  5. Windows客户端C/C++编程规范“建议”——指针
  6. Leptonica在VS2010中的编译及简单使用举例
  7. 【FFmpeg】使用sws_scale将AVFrame转换后的图像数据放入cv::Mat中
  8. 【C++】new和malloc的区别
  9. 【Go】Go基础(九):接口(Interfaces)与反射(reflection)
  10. wpf 窗口的返回值_如何:获取页函数的返回值