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. 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?

    方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性.重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同.参数个数不同或者二者都不同)则视 ...

  2. kali wireless driver install

    acer-gateway nv47h94c 1.lspci -nn |grep 0280 get pci-id root@silee:/# lspci -nn |grep 028003:00.0 Ne ...

  3. 动态切换input的 disables 属性

    $("input[type='text']").each(function(){ if($(this).data('parent_id')){ var _each_this_par ...

  4. 基于Bootstrap的遮罩层,带有加载提示

    1.body中的html <div class="modal fade" id="loadingModal"> <div style=&quo ...

  5. [设计篇]01.RESTFUL URI 简单入门设计

    1. HTTP Methods HTTP 常用方法: GET: 获取某个资源. POST: 创建一个新的资源. PUT: 替换某个已有的资源. PATCH: 修改某个已有的资源.-->这个自己没 ...

  6. ...args剩余参数用法

      剩余参数语法允许我们将一个不定数量的参数表示为一个数组. function sum(...theArgs) { return theArgs.reduce((previous, current) ...

  7. windows+nexus+maven环境搭建(转)

    windows nexus环境搭建 1.下载nexus 版本为 nexus-2.11.4-01-bundle 下载地址 这里写链接内容 2.将下载好的文件放到D盘进行解压 3.解压后目录结构 nexu ...

  8. Coursera在线学习---第七节.支持向量机(SVM)

    一.代价函数   对比逻辑回归与支持向量机代价函数. cost1(z)=-log(1/(1+e-z)) cost0(z)=-log(1-1/(1+e-z)) 二.支持向量机中求解代价函数中的C值相当于 ...

  9. pandas中DataFrame使用

    切片选择 #显示第一行数据print(df.head(1)) #显示倒数三行数据 print(df.tail(3)) loc  df.loc[row_index,col_index]  注意loc是根 ...

  10. AGC025简要题解

    AGC025简要题解 B RGB Coloring 一道简单题,枚举即可. C Interval Game 考虑可以进行的操作只有两种,即左拉和右拉,连续进行两次相同的操作是没有用的. 左拉时肯定会选 ...