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. NOIP2015Day2T3运输计划(二分+树上差分)

    做了这么多NOIPTG的题,这是唯一 一道一眼秒的T3(有时候T2还不会做QAQ)... 题目大意就不说了QWQ 思路大概是:啊最大值最小化,来个二分.检验mid的话,显然就是用最长路径减去所有边权& ...

  2. Linux回收站(改写rm防止误删文件无法恢复)

    rm -rf 慎用 命令敲得多了,常在河边走,难免会湿鞋 昨天,一个手误,敲错了命令,把原本想要留的文件夹给rm -rf掉了 几天心血全木有了,靠,死的心都有了 经百度,google以及尝试无果,哎, ...

  3. [zhuan]java发送http的get、post请求

    http://www.cnblogs.com/zhuawang/archive/2012/12/08/2809380.html Http请求类 package wzh.Http; import jav ...

  4. Codeforces Round #331 (Div. 2) A

    A. Wilbur and Swimming Pool time limit per test 1 second memory limit per test 256 megabytes input s ...

  5. SCU 4527 NightMare2 最短路+二分 好题

    可怜的又做噩梦了..但是这次跟上次不大一样,虽然他又被困在迷宫里,又被装上了一个定时炸弹,但是值得高兴的是,他发现他身边有数不清的财宝,所以他如果能带着这些财宝并活着逃出去的话,他就发财啦.不过,这次 ...

  6. 有向图的强联通分量 Tarjan算法模板

    //白书 321页 #include<iostream> #include<cstdio> #include<cstring> #include<vector ...

  7. ClusterId read in ZooKeeper is null 处理

    ClusterId read in ZooKeeper is null. Re-running the program after fixing issue 1 will result in the ...

  8. Android UI开发第二十四篇——Action Bar

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

  9. uva 10683 Fill

    https://vjudge.net/problem/UVA-10603 题意: 倒水问题,输出最少的倒水量和目标水量 如果无解,目标水量就是尽可能接近给定点的目标水量,但不得大于给定的目标水量 推推 ...

  10. 数据结构:Bitset

    这个东西看起来很棒棒的样子呀 bitset存储二进制数位 bitset就像一个bool类型的数组一样 bitset中的每个元素都能单独被访问 整数类型和布尔数组都能转化成bitset 有关Bitset ...