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 ...
随机推荐
- 判断字符串a和b是否互为旋转词
旋转词:把字符串str的任意部分移动到后面形成的新字符串叫做字符串str的旋转词. 比如abc的旋转词有 abc,acb,cba,... 判断str1和str2是否互为旋转词,其最优解可以是时间复杂度 ...
- Flutter 布局(一)- Container详解
本文主要介绍Flutter中非常常见的Container,列举了一些实际例子介绍如何使用. 1. 简介 A convenience widget that combines common painti ...
- 关于正餐智能POS6.0.1.1改版后,订单模块无法进行部分退款的FAQ
适用版本:智能POS正餐V6.0.1.1+ 适用情况:订单模块,无法输入自定义金额进行部分退款. 原因:为让报表统计的数据更准确. 改版之后仍可适用部分退款的情况: 1.口碑先付订单,可在口碑模块,选 ...
- Redis内存数据库快速入门
Redis简介 Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理.它支持数据结构,如 字符串,散列,列表,集合,带有范围查询的排序集,位图,超级日志,具有半径查询和流的 ...
- OkHttp简单使用
OkHttp是一个轻量优秀的网络框架.用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,) 使用方法: 1 ...
- [Hive_4] Hive 插入数据
0. 说明 Hive 插入数据的方法 && Hive 插入数据的顺序 && 插入复杂数据的方法 && load 命令详解 1. Hive 插入数据的方法 ...
- C# -- 随机数(Random)的使用
使用随机数产生一组大乐透号码 1. C#代码 1 Console.WriteLine("===============大乐透===红色球==============="); Lis ...
- Windows 下自动同步文件夹内容到另一个文件夹下
实现windows 使用bat脚本文件,复制文件夹到另一个盘,参考如下代码:/y是可以不显示:提示你需要覆盖一个文件,如下图: bat文件内容为 @echo off echo "使用bat脚 ...
- 【算法】LeetCode算法题-Roman To Integer
这是悦乐书的第145次更新,第147篇原创 今天这道题和罗马数字有关,罗马数字也是可以表示整数的,如"I"表示数字1,"IV"表示数字4,下面这道题目就和罗马数 ...
- mysql 数据备份与数据导入到出
一.数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异构系统中如Windows. #2. 逻辑备份: 备份的是建表.建库.插入等操作所执行SQL语句,适用于中小型数 ...