Zookeeper的api的简单使用(转载)

转载自: http://www.cnblogs.com/sunddenly/p/4031881.html

1.API

zk

 

2.API 示例

ZooKeeper中的组成员关系

理解ZooKeeper的一种方法就是将其看作一个具有高可用性的文件系统。但这个文件系统中没有文件和目录,而是统一使用“节点”(node)的概念,称为znode。znode既可以作为保存数据的容器(如同文件),也可以作为保存其他znode的容器(如同目录)。所有的znode构成一个层次化的命名空间。一种自然的建立组成员列表的方式就是利用这种层次结构,创建一个以组名为节点名的znode作为父节点,然后以组成员名(服务器名)为节点名来创建作为子节点的znode。如下图给出了一组具有层次结构的znode。

 

创建组示例代码:

package org.zk;import java.io.IOException;
import java.util.concurrent.CountDownLatch;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;public class CreateGroup implements{private static final int SESSION_TIMEOUT=5000;private ZooKeeper zk;private CountDownLatch connectedSignal=new CountDownLatch(1);@Overridepublic void(WatchedEvent event) {if(event.getState()==KeeperState.SyncConnected){connectedSignal.countDown();}}public static void main(String[] args) throws IOException, InterruptedException, KeeperException {CreateGroup createGroup = new CreateGroup();createGroup.connect(args[0]);createGroup.create(args[1]);createGroup.close();}private void close() throws InterruptedException {zk.close();}private void create(String groupName) throws KeeperException, InterruptedException {String path="/"+groupName;if(zk.exists(path, false)== null){}System.out.println("Created:"+path);} private void connect(String hosts) throws IOException, InterruptedException {zk = new ZooKeeper(hosts, SESSION_TIMEOUT, this);connectedSignal.await();}
}

 

代码分析

在上面代码中,main()方法执行时,创建了一个CreateGroup实例并且调用了这个实例的connect()方法。connect方法实例化了一个新的ZooKeeper类的对象,这个类是客户端API中的主要类,并且负责维护客户端和ZooKeeper服务之间的连接。ZooKeeper类的构造函数有三个参数:


  第一个是:ZooKeeper服务的主机地址,可指定端口,默认端口是2181。
  第二个是:以毫秒为单位的会话超时参数,这里我们设成5秒。
  第三个是:参数是一个Watcher对象的实例。

 

Watcher对象接收来自于ZooKeeper的回调,以获得各种事件的通知。在这个例子中,CreateGroup是一个Watcher对象,因此我们将它传递给ZooKeeper的构造函数。
当一个ZooKeeper的实例被创建时,会启动一个线程连接到ZooKeeper服务。由于对构造函数的调用是立即返回的,因此在使用新建的ZooKeeper对象之前一定要等待其与ZooKeeper服务之间的连接建立成功。我们使用Java的CountDownLatch类来阻止使用新建的ZooKeeper对象,直到这个ZooKeeper对象已经准备就绪。这就是Watcher类的
用途,在它的接口中只有一个方法:
public void process(WatcherEvent event);
客户端已经与ZooKeeper建立连接后,Watcher的process()方法会被调用,参数是一个表示该连接的事件。在接收到一个连接事件(由 Watcher.Event.KeeperState的枚举型值SyncConnected来表示)时,我们通过调用CountDownLatch的countDown()方法来递减它的计数器。锁存器(latch)被创建时带有一个值为1的计数器,用于表示在它释放所有等待线程之前需要发生的事件数。在调用一欢countDown()方法之后,计数器的值变为0,则await()方法返回。
现在connect()方法已经返回,下一个执行的是CreateGroup的create()方法。在这个方法中,我们使用ZooKeeper实例中的create()方法来创建一个新的ZooKeeper的znode。所需的参数包括

路径:用字符串表示。
znode的内容:字节数组,本例中使用空值。
访问控制列表:简称ACL,本例中使用了完全开放的ACL,允许任何客户端对znode进行读写。

创建znode的类型:有两种类型的znode:短暂的和持久的。

创建znode的客户端断开连接时,无论客户端是明确断开还是因为任何原因而终止,短暂znode都会被ZooKeeper服务删除。与之相反,当客户端断开连接时,持久znode不会被删除。我们希望代表一个组的znode存活的时间应当比创建程序的生命周期要长,因此在本例中我们创建了一个持久的znode。

create()方法的返回值是ZooKeeper所创建的路径,我们用这个返回值来打印一条表示路径成功创建的消息。当我们查看“顺序znode”(sequential znode)时.会发现create()方法返回的路径与传递给该方法的路径不同。

 

加入组

package org.zk;import java.io.IOException;import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids;public class JoinGroup extends ConnectionWatcher{public void join(String groupName,String memberName) throws KeeperException, InterruptedException{;String createdPath=zk.(path, null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);System.out.println("Created:"+createdPath);}public static void main(String[] args) throws InterruptedException, IOException, KeeperException {JoinGroup joinGroup = new JoinGroup();joinGroup.connect(args[0]);joinGroup.join(args[1], args[2]);//stay alive until process is killed or thread is interrupted
        Thread.sleep(Long.MAX_VALUE);}
}

列出组成员

package org.zk;import java.io.IOException;
import java.util.List;import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooKeeper;public class ListGroup extends ConnectionWatcher {public void list(String groupNmae) throws KeeperException, InterruptedException{String path ="/"+groupNmae;try {List<String> children = (path, false);if(children.isEmpty()){System.out.printf("No memebers in group %s\n",groupNmae);System.exit(1);}for(){System.out.println(child);}} catch (KeeperException.NoNodeException e) {System.out.printf("Group %s does not exist \n", groupNmae);System.exit(1);} }public static void main(String[] args) throws IOException, InterruptedException, KeeperException {ListGroup listGroup = new ListGroup();listGroup.connect(args[0]);listGroup.list(args[1]);listGroup.close();}
}

删除组

下面来看如何删除一个组。ZooKeeper类提供了一个delete()方法,该方法有两个参数:

1. 路径

2. 版本号

如果所提供的版本号与znode的版本号一致,ZooKeeper会删除这个znode。这是一种乐观的加锁机制,使客户端能够检测出对znode的修改冲突。通过将版本号设置为-1,可以绕过这个版本检测机制,不管znode的版本号是什么而直接将其删除。ZooKeeper不支持递归的删除操作,因此在删除父节点之前必须先删除子节点。

在代码3.5中,DeleteGroup类用于删除一个组及其所有成员。
代码3.5用于删除一个组及其所有成员的程序

package org.zk;import java.io.IOException;
import java.util.List;import org.apache.zookeeper.KeeperException;public class DeleteGroup extends ConnectionWatcher{public void delete(String groupName) throws InterruptedException, KeeperException{String path="/"+groupName;List<String> children;try {children = (path, false);for(String child:children){            }zk.delete(path, -1);} catch (KeeperException.NoNodeException e) {System.out.printf("Group %s does not exist\n", groupName);System.exit(1);}    }public static void main(String[] args) throws InterruptedException, IOException, KeeperException {DeleteGroup deleteGroup = new DeleteGroup();deleteGroup.connect(args[0]);deleteGroup.delete(args[1]);deleteGroup.close();}
}

转载于:https://www.cnblogs.com/chenyansong/p/5529670.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395883.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

必须使用301重定向的运用场景

必须使用301重定向的运用场景

1.1好素数

题目 题意&#xff1a;一个好素数的定义是&#xff0c;他是一个素数&#xff0c;然后他的左右两边10区间内存在素数&#xff0c;那么他就是好素数&#xff0c;现在让你输入一个数字&#xff0c;这个数字以内的好素数的数量。 解题方法&#xff1a;先把每一个数字是不是素数判断…

jquery.vue.js_一个Vue.js简介,面向只了解jQuery的人

jquery.vue.jsby Matt Rothenberg马特罗森伯格(Matt Rothenberg) 一个Vue.js简介&#xff0c;面向只了解jQuery的人 (A Vue.js introduction for people who know just enough jQuery to get by) I’ve had a love-hate relationship with JavaScript for years.我与JavaScrip…

python 矩阵获取行数_4个最佳项目创意的代码片段和示例,旨在为Python和机器学习构建出色的简历!...

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达一篇文章带你了解4个最佳项目创意的代码片段和示例Python是一种特殊的编程语言&#xff0c;适用于从初学者到中级用户。由于它的灵活性&#xff0c;它正逐渐成为一种非常流…

Android 多状态加载布局的开发 Tips

2019独角兽企业重金招聘Python工程师标准>>> 什么是多状态 Layout 对于大多数 App 而言&#xff0c;项目中都有多状态加载 View 这种需求&#xff0c;如下图所示。 对应到开发中&#xff0c;我们通常会开发一个对应的自定义 layout 用于根据页面不同的状态来显示不同…

XML解析之JAXP案例详解

根据一个CRUD的案例&#xff0c;对JAXP解析xml技术&#xff0c;进行详细的解释&#xff1a; 首先&#xff0c;已知一个xml文件中的数据如下&#xff1a; <?xml version"1.0" encoding"UTF-8" standalone"no"?> <书架><书 出版社…

随机梯度下降

1.SGD 代价函数通常可以分解成每个样本的代价函数的总和转载于:https://www.cnblogs.com/bigcome/p/10042800.html

iis mysql5.7_手动配置网站环境 IIS 10+PHP 7.1+MySQL 5.7

之前配置环境一直用的一键安装包&#xff0c;不管是phpStudy还是lnmp&#xff0c;昨天尝试在自己电脑配置一下iis的环境&#xff0c;也踩了一些坑&#xff0c;整理了一下。测试电脑是Windows10&#xff0c;理论上Win7和IIS7.5都支持的。安装 IIS1&#xff1a;控制面板 > 程序…

如何使用Apache的Prediction IO Machine Learning Server构建推荐引擎

by Vaghawan Ojha通过瓦哈万欧哈(Vaghawan Ojha) 如何使用Apache的Prediction IO Machine Learning Server构建推荐引擎 (How to build a recommendation engine using Apache’s Prediction IO Machine Learning Server) This post will guide you through installing Apache…

JavaScript DOM编程艺术第二版学习(1/4)

接下来项目需要网页相关知识&#xff0c;故在大牛的指引下前来阅读本书。 记录方式&#xff1a;本书分四部分阅读&#xff0c;完成阅读之后会多写一篇包括思维导图的算是阅读指南的东西&#xff0c;浏览的童鞋看着指南可以跳过一些不必要的坑~ 当前水平&#xff1a;HTML&CS…

github开源大项目_GitHub刚刚发布了一份大规模的开源指南

github开源大项目Here are three links worth your time:这是三个值得您花费时间的链接&#xff1a; GitHub just released a massive guide to contributing to open source (5 to 60 minute read) GitHub刚刚发布了一份有关开源的大型指南( 阅读5至60分钟 ) A new way to br…

mysql中where条件判断语句_MySQL Where 条件语句介绍和运算符小结

WHERE 条件有时候操作数据库时&#xff0c;只操作一些有条件限制的数据&#xff0c;这时可以在SQL语句中添加WHERE子句来规定数据操作的条件。语法&#xff1a;SELECT column,… FROM tb_name WHERE definitionWHERE 关键字后面接有效的表达式(definition)&#xff0c;该表达式…

node webkit(nw.js) 设置自动更新

原理&#xff1a;把更新的文件放在服务器上&#xff0c;设置一个客户端版本号&#xff0c;每次打开客户端的时候&#xff0c;通过接口获取服务器上的版本&#xff0c;如果高于本地的版本就下载服务器上的代码&#xff0c;低于或等于就不更新 1 <script>2 var htt…

个人工作总结04(冲刺二)

今天是团队第二次冲刺阶段开始的第04天&#xff0c;我的工作总结如下&#xff1a; 一、昨天干了什么&#xff1f; 知识圈查询功能 基本实现数据库查询 (未完成) 二、今天准备做什么&#xff1f; 知识圈查询功能 基本实现数据库查询 三、遇到了什么困难&#xff1f; 数据库访问出…

mysql8.0版1130_navicat premium连接mysql 8.0报错error 10061和error1130问题

昨天安装了最新版的mysql navicat premium, 但没来得及测试使用Navicat连接。今天上班时&#xff0c;使用Navicat premium连接mysql时&#xff0c;出现报错ERROR 2003 (HY000): Can’t connect to MySQL server on ‘1XX.XX.XX.XX’ (10061).起初以为是mysql没有安装成功&#…

freecodecamp_为什么您一定要参与freeCodeCamp的一个研究小组

freecodecampby Frederick Ige弗雷德里克艾格(Frederick Ige) 为什么您一定要参与freeCodeCamp的一个研究小组 (Why you should definitely get involved with one of freeCodeCamp’s study groups) I’m writing this article in hopes of convincing you to take advantage…

C语言运行时数据结构

段&#xff08;Segment&#xff09;&#xff1a; 对象文件/可执行文件&#xff1a; SVr4 UNIX上被称为ELF&#xff08;起初"Extensible Linker Format", 现在"Executable and Linking Format"&#xff09;文件。BSD UNIX上被称为a.out。这些格式都具有段的…

Java挂起线程

2019独角兽企业重金招聘Python工程师标准>>> 不优雅的suspend import java.util.concurrent.TimeUnit;public class SuspendTest {static Object lock new Object();SuppressWarnings("deprecation")public static void main(String[] args) {Suspend s1…

Hibernate包及相关工具包下载地址

Hibernate包及相关工具包下载地址&#xff1a; http://prdownloads.sourceforge.net/hibernate/ 这里包含所有hibernate各个版本的包下载&#xff0c;且提供了 Middlegen Hibernate及hibernate-extensions包的下载。这两个包是用于自动生成相就的JAVA和*.hb…

init(coder:)_2018年《 New Coder》调查:31,000人告诉我们他们如何学习编码并在工作中获得工作…

init(coder:)More than 31,000 people responded to our 2018 New Coder Survey, granting researchers an unprecedented glimpse into how adults are learning to code.超过31,000人对我们的2018年《新编码器调查》做出了回应&#xff0c;使研究人员对成年人如何学习编码有了…