七:zooKeeper开源客户端ZkClient的api测试
ZkClient是Gitthub上一个开源的ZooKeeper客户端。ZKClient在ZooKeeper原生API接口之上进行了包装,是一个更加易用的ZooKeeper客户端。同时ZKClient在内部实现诸如Session超时重连,Watcher反复注册等功能。
一:maven依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.5</version>
</dependency>
二:一个java存储实体
package com.yeepay.sxf.testZkClient; import java.io.Serializable; /**
* 用户对象
* @author sxf
*
*/
public class User implements Serializable{
private int id;
private String name;
private String address; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} }
三:测试源代码
package com.yeepay.sxf.testZkClient; import java.util.List; import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.serialize.BytesPushThroughSerializer;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
/**
* zkclient的api测试
* acl权限相关操作和原生zookeeper客户端一样
* @author sxf
*
*/
public class CreateSession { public static void main(String[] args) throws InterruptedException {
//第一个参数:zk的ip:端口号
//会话过期时间
//链接超时时间
//序列化器(将java对象转化成byte数组,得到时从byte数组反序列化成java对象)这个序列化器在事件订阅上,修改数据一定要保持一致,否则无效果
//ZkClient zkClient=new ZkClient("10.151.30.75:2181", 10000, 10000, new SerializableSerializer()); //这个客户端链接,传入的序列化器皿等于什么都没做
ZkClient zkClient=new ZkClient("10.151.30.75:2181", 10000, 10000, new BytesPushThroughSerializer()); //创建一个节点
//createNode(zkClient); //获取一个节点中存取的值
//getNodeValue(zkClient); //获取一个节点下的子节点列表
//getNodeChildList(zkClient); //判断一个节点是否存在
//isNodeExists(zkClient); //删除一个节点
//deleteNode(zkClient); //修改一个节点的数据
//updateNodeValue(zkClient); //为某个节点的子节点列表发生变化订阅一个事件
//whenChildListChangeThenDoSomeThing(zkClient); //为某个节点存储的值发生变化或者节点被删除订阅一个事件
whenNodeValueChangeThenDoThing(zkClient); Thread.sleep(Integer.MAX_VALUE);
} /**
* 创建一个node节点
* @param zkClient
*/
public static void createNode(ZkClient zkClient){
//user 对象必须实现序列化接口Serializable
User user=new User();
user.setId(1);
user.setName("shangxiaofei");
user.setAddress("smx");
//(节点路径,节点数据,持久节点)
String path=zkClient.create("/node_131", user, CreateMode.PERSISTENT);
System.out.println("CreateSession.createNode(创建节点路径为:)"+path);
} /**
* 获取一个节点中存取的值
* @param zkClient
*/
public static void getNodeValue(ZkClient zkClient){ Stat stat=new Stat();
//获取一个节点中存取的值
User user=zkClient.readData("/node_131",stat);
System.out.println("CreateSession.getNodeValue(id==>)"+user.getId());
System.out.println("CreateSession.getNodeValue(name==>)"+user.getName());
System.out.println("CreateSession.getNodeValue(address==>)"+user.getAddress());
System.out.println("CreateSession.getNodeValue(节点状态==>)"+stat);
} /**
* 获取某个节点的子节点列表
* @param zkClient
*/
public static void getNodeChildList(ZkClient zkClient){ List<String> nodesList=zkClient.getChildren("/");
System.out.println("CreateSession.getNodeChildList(“/”下的子节点列表为=>)"+nodesList);
} /**
* 检测某一个节点是否存在
* @param zkClient
*/
public static void isNodeExists(ZkClient zkClient){
boolean flag=zkClient.exists("/node_132");
System.out.println("CreateSession.isNodeExists(节点是否存在的结果)"+flag);
} /**
* 删除一个节点或删除存在子节点的节点
* @param zkClient
*/
public static void deleteNode(ZkClient zkClient){
//删除无子节点的节点。如果存在子节点,抛出异常
boolean flag=zkClient.delete("/node_131");
System.out.println("CreateSession.deleteNode(删除无子节点的节点结果==>)"+flag); //删除存在子节点的节点。先深入子节点,删除掉所有子节点的节点,再删除当前节点
boolean flag2=zkClient.deleteRecursive("/node_131");
System.out.println("CreateSession.deleteNode(删除存在子节点的节点结果==>)"+flag2);
} /**
* 修改一个数据节点中存储的值
* @param zkClient
*/
public static void updateNodeValue(ZkClient zkClient){
User user=new User();
user.setId(100);
user.setName("shangxiaoshuai");
user.setAddress("smxcyxzyc");
//修改一个节点中存储的数据
zkClient.writeData("/node_131", user); //修改一个节点中存储的数据,实现类似乐观锁的功能
zkClient.writeData("/node_131", user, 1);
} /**
* 当子节点列表发生变化,则触发一个事件
*/
public static void whenChildListChangeThenDoSomeThing(ZkClient zkClient){
/**
* 可以监听(1)子节点列表发生变化,增加新子节点,删除子节点
* (2)节点本身被删除
* (3)节点本身被创建,意味着可以订阅一个并不存在的节点的监听事件
*/ zkClient.subscribeChildChanges("/node_132", new WhenChildChangeThing());
}
/**
* 当子节点列表发生变化的事件实现类
* @author sxf
*
*/
private static class WhenChildChangeThing implements IZkChildListener{ @Override
public void handleChildChange(String parentPath,List<String> currentChilds) throws Exception {
System.out.println("节点列表变化的父节点路径==>"+parentPath);
System.out.println("当前的节点列表==>"+currentChilds);
} } /**
* 为节点数据内容发生变化订阅一个事件
* @param zkClient
*/
public static void whenNodeValueChangeThenDoThing(ZkClient zkClient){
zkClient.subscribeDataChanges("/node_132", new WhenNodeValueChange());
}
/**
* 当数据节点存储的值发生变化的事件监听类
* @author sxf
*
*/
private static class WhenNodeValueChange implements IZkDataListener{ //当节点数据内容发生变化这个函数被调用
@Override
public void handleDataChange(String dataPath, Object data)
throws Exception {
System.out.println("节点数据内容发生变化,变化后的值为==>"+data);
System.out.println("节点数据内容发生变化,变化节点的路径==>"+dataPath);
} //当节点被删除时这个函数被调用
@Override
public void handleDataDeleted(String dataPath) throws Exception {
System.out.println("节点被删除的路径为==>"+dataPath);
} }
}
七:zooKeeper开源客户端ZkClient的api测试的更多相关文章
- 八:Zookeeper开源客户端Curator的api测试
curator是Netflix公司开源的一套ZooKeeper客户端,Curator解决了很多ZooKeeper客户端非常底层的细节开发工作.包括连接重连,反复注册Watcher等.实现了Fluent ...
- Zookeeper开源客户端框架Curator简介
Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...
- Zookeeper开源客户端框架Curator简介[转]
Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...
- Zookeeper开源客户端Curator之创建会话
前面Zookeeper的链接使用的都是其提供的原生代码,实际开发过程中非常底层的细节开发工作如连接重连,反复注册等耗费开发人员大量的工作精力并且重复工作.而开源客户端Curator的出现解决了该类问题 ...
- zookeeper开源客户端curator
zookeeper的原生api相对来说比较繁琐,比如:对节点添加监听事件,当监听触发后,我们需要再次手动添加监听,否则监听只生效一次:再比如,断线重连也需要我们手动代码来判断处理等等.对于curato ...
- Zookeeper开源客户端Curator的使用
开源zk客户端-Curator 创建会话: RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3); CuratorFramewor ...
- Zookeeper开源客户端Curator之事件监听详解
Curator对Zookeeper典型场景之事件监听进行封装,提供了使用参考.这篇博文笔者带领大家了解一下Curator的实现方式. 引入依赖 对于Curator封装Zookeeper的典型场景使用都 ...
- Zookeeper开源客户端框架Curator的使用
CuratorFramework Curator框架提供了一套高级的API, 简化了ZooKeeper的操作. 话不多说,看代码 package com.donews.data.util import ...
- ZooKeeper客户端原生API的使用以及ZkClient第三方API的使用
这两部分内容的介绍主要讲的是节点及节点内容和子节点的操作,并且讲解的节点的事件监听以及ACL授权 ZooKeeper客户端原生API的使用 百度网盘地址: http://pan.baidu.com/s ...
随机推荐
- de4dot 用法
使用de4dot反混淆一下 用法 de4dot -f input.dll -o output.dll
- Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) 题解
Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 2) 题目链接:https://codeforces.com/contest/1130 ...
- Codeforces Round #532 (Div. 2):F. Ivan and Burgers(贪心+异或基)
F. Ivan and Burgers 题目链接:https://codeforces.com/contest/1100/problem/F 题意: 给出n个数,然后有多个询问,每次回答询问所给出的区 ...
- zabbix调优PPT
http://www.slideshare.net/xsbr/alexei-vladishev-zabbixperformancetuning# http://zabbixzone.com/zabbi ...
- C#学习之泛型准备
想要把泛型搞明白,最好先弄明白下面的代码实例 本实例是建立了两个类,然后在类中可以添加任意类型的值,并且可以利用foreach语句读出 //第一个节点类,放在一个文件中 using System; u ...
- lightoj 1341
lightoj 1341 Aladdin and the Flying Carpet 链接:http://lightoj.com/volume_showproblem.php?problem=134 ...
- 同一台服务器(电脑)运行多个Tomcat
同一台电脑运行不能同时运行多个未修改过配置tomcat的原因在于:一台电脑的一个端口只能被一个程序使用,多个tomcat启动会因为端口号号被占用的原因而启动失败. 如果想要在一台电脑上同时运行多个to ...
- Object.defineProperty 与 属性描述符
为JavaScript对象新增或者修改属性,有两种不同方式:直接使用=赋值或者使用Object.defineProperty 定义,使用后者的话还可以设置属性的描述符. Object.definePr ...
- dp优化-四边形不等式(模板题:合并石子)
学习博客:https://blog.csdn.net/noiau/article/details/72514812 看了好久,这里整理一下证明 方程形式:dp(i,j)=min(dp(i,k)+dp( ...
- 简易微信小程序签到功能
一.效果图 点击签到后 二.数据库 用一张数据表存用户签到的信息,每次用户签到都会往表中添加一条记录了用户id和签到日期的数据,如下图 三.后端 后端写两个接口,一个用于查询用户今日是否签到和签到记录 ...