zookeepeer使用java api
一、引入依赖
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.11</version>
</dependency> <!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
二、测试API
1、测试Zookeeper的获取数据的功能
/**
* 测试Zookeeper的获取数据的功能
* @author 西门吹牛
* @throws Exception
* PS:在其中一台服务器断开的时候,这个用例是跑不过的
*/
@Test
public void getDataTest() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
Stat stat=new Stat();
byte[] bytes=zk.getData("/root",null,stat);
System.out.println("path:"+new String(bytes));
}
2、创建路径
/**
* 创建路径
* @throws Exception
* PS:临时性节点不能有孩子
* acl:access control list访问控制列表
* PERSISTENT 持久化节点,不会被删除
* PERSISTENT_SEQUENTIAL 持久化节点,名称会追加一个单调递增的数字
* EPHEMERAL 临时节点,session丢失后会删除
* EPHEMERAL_SEQUENTIAL 临时节点,名称会追加一个单调递增的数字
*/
@Test
public void createPathTest() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
String strPath= zk.create("/root/sxl_node","sxl_node_data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("path"+strPath);
}
3、删除路径
/**
* 删除路径
* @throws Exception
*/
@Test
public void deletePathTest() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
//version等价于数据库的乐观锁
zk.delete("/root/sxl_node",0);
}
4、设置数据
/**
* 设置数据
* @throws Exception
* 运行之前要去查一下数据版本,每次跑一次,数据版本会加1,这里写的是1
*/
@Test
public void setDataTest() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
Stat stat=zk.setData("/root","new_data".getBytes(),1);
System.out.println("stat_version:"+stat.getVersion());
}
5、获取孩子节点
/**
* 获取孩子节点
* @throws Exception
*/
@Test
public void getChildren() throws Exception{
ZooKeeper zk=new ZooKeeper(strConn,2000,null);
List<String> nodeList=zk.getChildren("/",null);
for(String node:nodeList){
System.out.println("node:"+node);
}
}
三、注册观察者
我们注册观察者的目的是为了捕获集群的事件,当我们注册了观察者之后,集群发生事件就会发生回调。
1、回调函数是one time trigger(一次性触发)
/**
* 观察者模式
* @throws Exception
*/
@Test
public void watcherTest() throws Exception{
Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("有事情发生:"+watchedEvent.getType());
}
}; ZooKeeper zk=new ZooKeeper(strConn,2000,watcher);
//注意:
// 1.这里只会输出hello,并不会打印"有事情发生"这句话
// 2.但是这不意味着回调函数没有起作用,而是回调函数(实际是在后台开一个线程)还没有机会打印的时候,程序已经运行完成了,可以跟watcherTest2单元测试比较来看
System.out.println("hello");
}
/**
* 观察者模式2
* @throws Exception
*/
@Test
public void watcherTest2() throws Exception{
Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("有事情发生:"+watchedEvent.getType());
}
}; ZooKeeper zk=new ZooKeeper(strConn,2000,watcher);
Thread.sleep(5000);
System.out.println("hello");
}
/**
* 观察者模式3
* @throws Exception
* 这里只会打印一次有事情发生,因为zookeeper的事情发生是一次性触发(one time trigger)
*/
@Test
public void watcherTest3() throws Exception{
Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("有事情发生:"+watchedEvent.getType());
}
}; ZooKeeper zk=new ZooKeeper(strConn,2000,watcher);
Stat stat=zk.setData("/root","root_new_data".getBytes(),2); while (true) {
Thread.sleep(5000);
}
}
2、通过回调函数来获取数据变化的事件
/**
* 观察者模式4
* @throws Exception
* 这里我们在获取数据的时候加了一个watcher,这样在数据变化的时候会回调这个watcher,我们就知道数据改变了
*/
@Test
public void watcherTest4() throws Exception{
Watcher watcher=new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("有事情发生:"+watchedEvent.getType());
}
}; ZooKeeper zk=new ZooKeeper(strConn,2000,watcher);
byte[] data=zk.getData("/root",watcher,null);
System.out.println("data:"+new String(data));
Stat stat=zk.setData("/root","root_new_data".getBytes(),3); while (true) {
Thread.sleep(5000);
}
}
zookeepeer使用java api的更多相关文章
- Atitit 图像处理 调用opencv 通过java api attilax总结
Atitit 图像处理 调用opencv 通过java api attilax总结 1.1. Opencv java api的支持 opencv2.4.2 就有了对java api的支持1 1. ...
- 【分布式】Zookeeper使用--Java API
一.前言 上一篇博客我们通过命令行来操作Zookeper的客户端和服务端并进行相应的操作,这篇主要介绍如何通过API(JAVA)来操作Zookeeper. 二.开发环境配置 首先打开Zookeeper ...
- Elasticsearch的CRUD:REST与Java API
CRUD(Create, Retrieve, Update, Delete)是数据库系统的四种基本操作,分别表示创建.查询.更改.删除,俗称"增删改查".Elasticsearch ...
- [转]HDFS中JAVA API的使用
HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的文件进行操作的过程. 对分HDFS中的 ...
- HDFS中JAVA API的使用
HDFS中JAVA API的使用 HDFS是一个分布式文件系统,既然是文件系统,就可以对其文件进行操作,比如说新建文件.删除文件.读取文件内容等操作.下面记录一下使用JAVA API对HDFS中的 ...
- java安全沙箱(四)之安全管理器及Java API
java是一种类型安全的语言,它有四类称为安全沙箱机制的安全机制来保证语言的安全性,这四类安全沙箱分别是: 类加载体系 .class文件检验器 内置于Java虚拟机(及语言)的安全特性 安全管理器及J ...
- Java api 入门教程 之 JAVA的Random类
在实际的项目开发过程中,经常需要产生一些随机数值,例如网站登录中的校验数字等,或者需要以一定的几率实现某种效果,例如游戏程序中的物品掉落等. 在Java API中,在java.util包中专门提供了一 ...
- (转)Java API设计清单
转自: 伯乐在线 Java API设计清单 英文原文 TheAmiableAPI 在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度 ...
- 【hadoop2.6.0】利用Hadoop的 Java API
Hadoop2.6.0的所有Java API都在 http://hadoop.apache.org/docs/r2.6.0/api/overview-summary.html 里. 下面实现一个利用J ...
随机推荐
- java StringBuffer读写文件
java StringBuffer读写文件 StringBuffer的优势 较String:String每更新一次就会new一个新的对象出来,更新次数上去之后,内存开销太大.而StringBuffer ...
- Windows 10 运行原生Bash【Ubuntu】
当前widnows用户的 AppData\Local\lxss 目录下安装了ubuntu,其中rootfs是和ubuntu安装的目录一致 bash进入的就是LINUX的SHELL,因此其二进制格式是E ...
- Django 自带认证功能auth模块和User对象的基本操作
一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: authenticate() ...
- 【redis专题(10)】KEY设计原则与技巧
对比着关系型数据库,我们对redis key的设计一般有以下两种格式: 表名:主键名:主键值:列名 表名:主键值:列名 在所有主键名都是id的情况下(其实我个人不喜欢这种情况,比如user表,它的主键 ...
- MySQL 5.6.20-enterprise-commercial的参数文件位置问题
今天在折腾MySQL的参数文件时,突然发现MySQL 5.6.20-enterprise-commercial-advanced-log这个版本数据库的参数文件my.cnf的位置有点奇怪,如下所示: ...
- Cas 服务器 为Service定义UI
Cas服务器允许用户为每个Service自定义登陆等UI外观,但需要尊着Cas定于的规则: 一.为Service配置theme(主题) 在<Cas 服务器 Service(Cas客户端)注册信息 ...
- 关于wordpress慢的问题
随笔记载: 关于wordpress访问慢的原因,主要是wordpress采用了google前端库, 需替换wordpress/wp-includes/script-header.php中所有的goog ...
- Oracle EBS R12 GL_IMPORT_REFERENCES 映射
非原创. 转自出处: http://alloracleapps.com/oracle_apps/gl_import_references-columns-mapping-11i-vs-r12/
- mysql表分区简述
一. 简介 数据库分区 数据库分区是一种物理数据库设计技术.虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间,同时对于应用来说分区完全是 ...
- 用好lua+unity,让性能飞起来——lua与c#交互篇
前言 在看了uwa之前发布的<Unity项目常见Lua解决方案性能比较>,决定动手写一篇关于lua+unity方案的性能优化文. 整合lua是目前最强大的unity热更新方案,毕竟这是唯一 ...