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测试的更多相关文章

  1. 八:Zookeeper开源客户端Curator的api测试

    curator是Netflix公司开源的一套ZooKeeper客户端,Curator解决了很多ZooKeeper客户端非常底层的细节开发工作.包括连接重连,反复注册Watcher等.实现了Fluent ...

  2. Zookeeper开源客户端框架Curator简介

    Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...

  3. Zookeeper开源客户端框架Curator简介[转]

    Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...

  4. Zookeeper开源客户端Curator之创建会话

    前面Zookeeper的链接使用的都是其提供的原生代码,实际开发过程中非常底层的细节开发工作如连接重连,反复注册等耗费开发人员大量的工作精力并且重复工作.而开源客户端Curator的出现解决了该类问题 ...

  5. zookeeper开源客户端curator

    zookeeper的原生api相对来说比较繁琐,比如:对节点添加监听事件,当监听触发后,我们需要再次手动添加监听,否则监听只生效一次:再比如,断线重连也需要我们手动代码来判断处理等等.对于curato ...

  6. Zookeeper开源客户端Curator的使用

    开源zk客户端-Curator 创建会话: RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3); CuratorFramewor ...

  7. Zookeeper开源客户端Curator之事件监听详解

    Curator对Zookeeper典型场景之事件监听进行封装,提供了使用参考.这篇博文笔者带领大家了解一下Curator的实现方式. 引入依赖 对于Curator封装Zookeeper的典型场景使用都 ...

  8. Zookeeper开源客户端框架Curator的使用

    CuratorFramework Curator框架提供了一套高级的API, 简化了ZooKeeper的操作. 话不多说,看代码 package com.donews.data.util import ...

  9. ZooKeeper客户端原生API的使用以及ZkClient第三方API的使用

    这两部分内容的介绍主要讲的是节点及节点内容和子节点的操作,并且讲解的节点的事件监听以及ACL授权 ZooKeeper客户端原生API的使用 百度网盘地址: http://pan.baidu.com/s ...

随机推荐

  1. 牛客326B 背单词

    传送门:https://ac.nowcoder.com/acm/contest/326/B 题意:给你一个n,你需有找有多少个长度从1~n 的单词,满足最长连续元音少于A个并且最长连续辅音长度少于B. ...

  2. linux下bash脚本语法

    1.shell中的变量定义和引用(1)变量定义和初始化.shell是弱类型语言(语言中的变量如果有明确的类型则属于强类型语言:变量没有明确类型就是弱类型语言),和C语言不同.在shell编程中定义变量 ...

  3. Ubuntu修改系统语言为英文可支持中文

    简单来说,就行修改/etc/default/locale文件,设置语言位UTF-8,如果没有这个语言,就执行命令locale-gen en_US.UTF-8进行安装,没有即时生效的话就重启. 查看当前 ...

  4. MySQL 5.6 for Windows 解压缩版配置安装(转载)

    原文地址:点击这里 MySQL是一个小巧玲珑但功能强大的数据库,目前十分流行.但是官网给出的安装包有两种格式,一个是msi格式,一个是zip格式的.很多人下了zip格式的解压发现没有setup.exe ...

  5. 【Android】完善Android学习(三:API 3.0)

    备注:之前Android入门学习的书籍使用的是杨丰盛的<Android应用开发揭秘>,这本书是基于Android 2.2API的,目前Android已经到4.4了,更新了很多的API,也增 ...

  6. UVA 12716 GCD XOR

    https://vjudge.net/problem/UVA-12716 求有多少对整数(a,b)满足:1<=b<=a<=n,且gcd(a,b)=a XOR b 结论:若gcd(a, ...

  7. 数学:Burnside引理与Pólya定理

    这个计数定理在考虑对称的计数中非常有用 先给出这个定理的描述,虽然看不太懂: 在一个置换群G={a1,a2,a3……ak}中,把每个置换都写成不相交循环的乘积. 设C1(ak)是在置换ak的作用下不动 ...

  8. 插入排序Insertion sort 2

    原理类似桶排序,这里总是需要10个桶,多次使用 首先以个位数的值进行装桶,即个位数为1则放入1号桶,为9则放入9号桶,暂时忽视十位数 例如 待排序数组[62,14,59,88,16]简单点五个数字 分 ...

  9. JAVA获取Classpath根路径的方法

    方法一: String path = Test.class.getResource("/").toString(); System.out.println("path = ...

  10. Http跨域时候预检没通过的几种原因

    网上大多数涉及的原因(直接复制粘帖): CORS把HTTP请求分成两类,不同类别按不同的策略进行跨域资源共享协商. 1. 简单跨域请求. 当HTTP请求出现以下两种情况时,浏览器认为是简单跨域请求: ...