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. mysql 常用总结

    centos7 安装mysql 数据库安装参考:http://www.cnblogs.com/longrui/p/6071581.htmlhttps://www.cnblogs.com/yoursou ...

  2. 三大linux系统对比

    概述: centos作为服务器部署是第一选择.CentOS去除很多与服务器功能无关的应用,系统简单但非常稳定,命令行操作可以方便管理系统和应用,丰富的帮助文档和社区的支持. ubuntu最佳的应用领域 ...

  3. ACM1558两线段相交判断和并查集

    Segment set Problem Description A segment and all segments which are connected with it compose a seg ...

  4. 使用AAUTO语言开发的云桌面登录客户端

    AAUTO是一个国产小众语言,和lua算是近亲,官方网站 www.aau.cn. 使用aauto的优点我认为对于我来说最主要的有以下两点: 1.无需臃肿的框架类似.NET FRAMEWORK.Adob ...

  5. (第三章,第四章)http报文内的http信息,返回结果的http状态码

    第三章 http报文内的http信息 用于http协议交互的信息被称为http报文,包括请求报文和响应报文. 1.编码提升传输速率,在传输时编码能有效的处理大量的访问请求.但是编码的操作是计算机完成的 ...

  6. 【BZOJ2693】jzptab [莫比乌斯反演]

    jzptab Time Limit: 10 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description   求 Input 第一行一个 ...

  7. UIToolBar的半透明属性设置

      UIToolBar的半透明属性设置style:Translucent(Ps:长得很像翻译translation)   https://www.evernote.com/shard/s227/sh/ ...

  8. How to write educational schema.

    Sometimes, writing such educational schemas could be of much use, and creating such docs can be bene ...

  9. 贿赂囚犯 Bribe the prisoners ( 动态规划+剪枝)

    一个监狱里有P个并排着的牢房,从左往右一次编号为1,2,-,P.最初所有牢房里面都住着一个囚犯.现在要释放一些囚犯.如果释放某个牢房里的囚犯,必须要贿赂两边所有的囚犯一个金币,直到监狱的两端或者空牢房 ...

  10. java servlet jsp 导入boostrap css js

    1.在导入boostrap.css的时候注意了 一定要注意路径,你知道把js和css包放在servlet服务器的静态路径下面就是 lib 文件夹路径下,直接使用 lib/js/boostrap.css ...