当前位置: 首页 > 编程日记 > 正文

【ZooKeeper Notes 3】ZooKeeper Java API 使用样例

查看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, falsenull ) );
  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

相关文章:

一站式了解多模态、金融、事理知识图谱构建指南 | AI ProCon 2020

整理 | 许爱艳出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】7 月 3-4 日&#xff0c;由 CSDN 主办的第三届 AI 开发者大会&#xff08;AI ProCon 2020&#xff09;在线上举行。本次大会有超万人报名参与&#xff0c;参与人群覆盖 60 领域、5000…

CentOS7安装配置redis-3.0.0

一.安装必要包 yum install gcc 二.linux下安装 #下载 wget http://download.redis.io/releases/redis-3.0.0.tar.gz tar zxvf redis-3.0.0.tar.gz cd redis-3.0.0 #如果不加参数,linux下会报错 make MALLOClibc 安装好之后,启动文件 #启动redis src/redis-server &#关闭re…

ASP.NET重用代码技术 - 用户控件技术

作者&#xff1a; 苏红超 使用ASP.NET中的代码绑定技术来使得代码重用变得简单可行。我们发现&#xff0c;利用代码绑定技术我们可以容易的将我们的代码和内容分离开来&#xff0c;利用它可以建立可重用的代码&#xff0c;只是这种技术本身也存在着一些局限性。在本文中&…

liunx 下dhcp中继及服务器配置

dhcp:动态主机配置协议 使用udp协议 端口为67&#xff08;服务&#xff09;&#xff0c;68&#xff08;客户&#xff09; 作用&#xff1a;动态分配地址等参数 工作模式 1. 手工 manual server—地址池 &#xff08;ip—mac&#xff09; 2222----1.1.1.1 dhcpclient ------地址…

PyCharm vs VSCode,是时候改变你的 IDE 了!

作者 | Sohaib Ahmad译者 | 鹿未来&#xff0c;责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;也许是我有些落伍&#xff0c;或者也是因为JetBrains在Python IDE的市场上占有很大的份额&#xff0c;以至于直到最近我才发现&a…

(转)Linux 下 查看以及修改文件权限

场景&#xff1a;Linux环境下远程部署项目&#xff0c;发现因为文件权限问题&#xff0c;不能执行远端的可执行文件。问题还没解决&#xff0c;待议。。。 1 查看权限 在终端输入: ls -l xxx.xxx &#xff08;xxx.xxx是文件名&#xff09; 那么就会出现相类似的信息&#…

软件文档知多少?

作者&#xff1a;由于本人在无数网站看到此文 无法确定第一作者 请作者与本人联系如今&#xff0c;软件开发越来越复杂&#xff0c;软件功能也越来越丰富。而几乎所有成熟的商业软件&#xff0c;都是靠一个开发团队齐心协力的血汗结晶。“罗马不是一天建成的&#xff01;”&…

在 VMware ESXi 5.0 上安装万兆网卡驱动

2012年02月28日 | 标签: vmware esxi | 作者&#xff1a;vpsee 转载自&#xff1a;http://www.vpsee.com/2012/02/intall-network-card-driver-on-vmware-esxi-5-0/ 昨天刚发现新购的 Dell PowerEdge R710 服务器上配的 Intel Ethernet Server Adapter X520-T2 万兆网卡居然在…

漫谈 ClickHouse 在实时分析系统中的定位与作用

ClickHouse 是一款由俄罗斯Yandex公司开源的OLAP数据库&#xff0c;拥有着卓越的性能表现&#xff0c;在官方公布的基准测试中&#xff0c;ClickHouse的平均响应速度是Vertica的2.63倍、InfiniDB的17倍、MonetDB的27倍、Hive的126倍、MySQL的429倍以及Greenplum的10倍。自2016年…

Js+Dhtml:WEB程序员简易开发工具包(预先体验版)

作者&#xff1a;lshdic http://blog.csdn.net/lshdic/<HTML> <HEAD> <META http-equivContent-Type contenttext/html;charsetgb2312> <META nameGemeratpr content网络程序员伴侣(Lshdic)2005_开拓版> <TITLE>LD5工具</TITLE> <st…

残差网络的前世今生与原理 | 赠书

本文内容节选自《深度学习之模型设计&#xff1a;核心算法与案例实践》&#xff0c;作者言有三。本书详解了数十年来深层卷积神经网络模型的主流设计思想&#xff0c;理论讲解细致&#xff0c;实战案例丰富&#xff0c;是熟练掌握深度学习模型使用的必备参考资料。想要了解关于…

python---简单数据库

2019独角兽企业重金招聘Python工程师标准>>> #simple database#people people {Alice:{phone:2341,addr:Foo drive 23},Beth:{phone:9102,addr:Bar street 42},Ceil:{phone:3158,addr:Baz avenue 90} }#describe labels {phone:phone number,addr:address }name …

Linux系统之路——如何在CentOS7.2安装MySQL

一、Mysql 各个版本区别&#xff1a;1、MySQL Community Server 社区版本&#xff0c;开源免费&#xff0c;但不提供官方技术支持。2、MySQL Enterprise Edition 企业版本&#xff0c;需付费&#xff0c;可以试用30天。3、MySQL Cluster 集群版&#xff0c;开源免费。可将几个M…

Vml+Dhtml:制作一个应用渐变颜色效果不错的进度条

//原作:风云舞,载自: http://www.lshdic.com/bbs<HTML xmlns:v> <HEAD> <META http-equivContent-Type contenttext/html;charsetgb2312> <Meta nameGemeratpr content网络程序员伴侣(Lshdic)2004> <TITLE>效果不错的VML进度条</TITLE> &l…

使用inno setup打包程序完整脚本(.net框架检测,重复安装检测)

; 脚本由 Inno Setup 脚本向导 生成&#xff01;; 有关创建 Inno Setup 脚本文件的详细资料请查阅帮助文档&#xff01;#define MyAppName "小小鸟软件"#define MyAppVersion "2012.2.29"#define MyAppPublisher "小小鸟科技"#define MyAppURL &…

GPT-3到来,程序员会被AI取代吗?

作者 | Frederik Bussler译者 | 弯月&#xff0c;编辑 | 屠敏题图 | 自东方 IC出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;2017年的时候&#xff0c;曾有研究人员问&#xff1a;到2040年人工智能是否承担起大多数的编程工作&#xff1f;如今OpenAI的G…

iOS开发几年了,你清楚OC中的这些东西么!!!?

iOS开发几年了,你清楚OC中的这些东西么!!!? 前言几年前笔者是使用Objective-C进行iOS开发, 不过在两年前Apple发布swift的时候,就开始了swift的学习, 在swift1.2发布后就正式并且一直都使用了swift进行iOS的开发了, 之后就是对swift持续不断的学习, 近来swift3.0的发布, 更多的…

在做会员资料修改时,实现下拉菜单的默认项定位

作者&#xff1a;lshdic http://blog.csdn.net/lshdic/ <!--在写一个交友网站时碰到的问题,就是当会员修改资料时&#xff0c;如何定位SELECT的菜单列默认项&#xff0c;不过很容易就解决了--> <HTML> <HEAD> <META http-equivContent-Type contenttex…

NFS 文件共享的创建过程

nfs 文件共享的服务器 nfs服务需要两个软件包nfs-utils和portmap 启动nfs服务 # service portmap start # service nfs start # chkconfig nfs on 开机自动启动 配置文件&#xff1a; /etc/exports 想要共享某个文件则编辑配置文件 共享目录 共享IP&#xff08;共享属性&…

行业新风向!AI人才缺口30万,单个项目最高补贴1000万元!

最近&#xff0c;程序员届有一个重大好消息&#xff0c;可能很多人还不知道&#xff0c;那就是&#xff1a;国内某些城市已经开始程序员人才补贴了&#xff01;对于人工智能公司的项目开发、人才引进、科技研发&#xff0c;最高按照国拨经费的30%给予配套支持&#xff0c;单个项…

Robotium todolist.test.elements

2019独角兽企业重金招聘Python工程师标准>>> ElementsEditToDoItemActivity package com.example.todolist.test.elements;import android.widget.Button; import android.widget.EditText;import com.example.todolist.R; import com.robotium.solo.Solo;public cl…

经典的导航二级式导航菜单增强版

作者&#xff1a;lshdic http://blog.csdn.net/lshdic/<!--呵呵我发的上一版相信大家都看过了吧&#xff0c;想一想上一版的确是不怎么华丽&#xff0c;而且上一版是针对表格内的连接A而定位的而这一版的优点显然比上一版要华丽&#xff0c;速度一样快&#xff0c;而且是针…

【海洋女神原创】installshield 32位打包和64位打包的注意事项

32/64位问题要把握几点&#xff1a;1. 明确你的产品是否需要区分32/64位2. 明确你的产品中是否有32/64位的服务注册3. 了解InstallShield Build出来的安装包本身是32位应用程序4. 了解Windows 64位系统上的32位路径和64位路径差异以及如何在InstallShield的系统变量中找到对应的…

如何提高模型性能?这四大方法值得尝试 | CSDN 博文精选

作者 | BoCong-Deng编辑 | 屠敏封图 | 自东方 IC出品 | CSDN 博客写在前面在我们进行模型训练时&#xff0c;如果你只是想要让模型具有不错的性能&#xff0c;那么盲目地尝试网络架构足以达到目的。而在本文中&#xff0c; 我们将为你提供一套用于构建最先进深度学习模型的必备…

ORACLE11g 没有控制文件如何通过rman备份恢复数据的详细实战过程

1、副总裁需要裸恢复的严峻现实 集团总部的信息部负责人给我打电话说为了找一年前的记录&#xff0c;所以需要对一年前2015年5月1日的数据进行恢复。而2016年初因为进行迁移&#xff0c;所以有些文件可能丢失&#xff0c;手上只有rman全备文件&#xff0c;希望在一天之内找回&a…

C语言文件等题

1.#include <stdio.h>double fun(int n){ }main(){ int n; double s; printf("\nInput n: "); scanf("%d",&n); sfun(n); printf("\n\ns%f\n\n",s); NONO();}NONO(){/* 请在此函数内打开文件&#xff0c;输入测试数据&…

使用 Vml 制作立体柱状投票统计图的完整程序

作者&#xff1a;lshdic http://blog.csdn.net/lshdic/<!--以下便是完整的 JsVml 制作柱状投票统计图的完整程序,保存为HTM文件运行即可看到效果其中 array数组中的分组可以为6个也可以为2&#xff0c;3&#xff0c;4&#xff0c;5个等,运行以下程序需要您的浏览器支持VML…

Python, C++和Java代码互翻,Facebook开发首个自监督神经编译器

译者 | 刘畅出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;将早期的编程语言&#xff08;例如COBOL&#xff09;的代码库迁移到现在的编程语言&#xff08;例如Java或C&#xff09;是一项艰巨的任务&#xff0c;它需要源语言和目标语言方面的专业知识。COBOL如今仍在…

pinpoint的id的生成

traceId的生成 public String getTransactionId() {return TransactionIdUtils.formatString(agentId, agentStartTime, transactionSequence);}public static final String TRANSACTION_ID_DELIMITER "^";public static String formatString(String agentId, long …

X@X.X域名转向的实现

www.chinacs.net 中文C#技术站 当你看到csdncsdn.com时&#xff0c;你肯定把这当作电子邮件地址&#xff0c;其实这个不一定是邮件地址&#xff0c;有可能是域名。现在有越来越多的人开始使用这个形式的地址了。初看起来&#xff0c;你不要以为这个是一个什么非常了不起的技术&…