1. 简介
ZkClient是Github上一个开源的zookeeper客户端,在Zookeeper原生API接口之上进行了包装,是一个更易用的Zookeeper客户端,同时,zkClient在内部还实现了诸如Session超时重连、Watcher反复注册等功能
2. 准备工作
- 导入依赖
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.2</version>
</dependency>
3. 创建会话
使用ZkClient可以轻松的创建会话,连接到服务端。
package com.study.zkclient;
import org.I0Itec.zkclient.ZkClient;
public class CreateSession {
/*
借助zkclient完成会话的创建
*/
public static void main(String[] args) {
/*
创建一个zkclient实例就可以完成连接,完成会话的创建
serverString : 服务器连接地址
注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
*/
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
System.out.println("会话被创建了..");
}
}
4. 创建节点
package com.study.zkclient;
import org.I0Itec.zkclient.ZkClient;
public class Create_Note {
/*
借助zkclient完成会话的创建
*/
public static void main(String[] args) {
/*
创建一个zkclient实例就可以完成连接,完成会话的创建
serverString : 服务器连接地址
注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
*/
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
System.out.println("会话被创建了..");
//创建节点
/*
createParents : 是否要创建父节点,如果值为true,那么就会递归创建节点
*/
zkClient.createPersistent("/sys-zkclient/c1",true);
System.out.println("节点递归创建完成");
}
}
结果表明已经成功创建了节点,值得注意的是,在原生态接口中是无法创建成功的(父节点不存在),但是通过ZkClient通过设置createParents参数为true可以递归的先创建父节点,再创建子节点
5. 删除节点
ZkClient提供了递归删除节点的接口,即其帮助开发者先删除所有子节点(存在),再删除父节点。
package com.study.zkclient;
import org.I0Itec.zkclient.ZkClient;
public class Delete_Note {
/*
借助zkclient完成会话的创建
*/
public static void main(String[] args) {
/*
创建一个zkclient实例就可以完成连接,完成会话的创建
serverString : 服务器连接地址
注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
*/
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
System.out.println("会话被创建了..");
// 递归删除节点
String path = "/sys-zkclient/c1";
zkClient.createPersistent(path+"/c11");
zkClient.deleteRecursive(path);
System.out.println("递归删除成功");
}
}
结果表明ZClient可直接删除带子节点的父节点,因为其底层先删除其所有子节点,然后再删除父节点
6. 获取子节点
package com.study.zkclient;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
import java.util.List;
public class Get_NoteChildren {
/*
借助zkclient完成会话的创建
*/
public static void main(String[] args) throws InterruptedException {
/*
创建一个zkclient实例就可以完成连接,完成会话的创建
serverString : 服务器连接地址
注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
*/
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
System.out.println("会话被创建了..");
// 获取子节点列表
List<String> children = zkClient.getChildren("/sys-zkclient");
System.out.println(children);
// 注册监听事件
/*
客户端可以对一个不存在的节点进行子节点变更的监听
只要该节点的子节点列表发生变化,或者该节点本身被创建或者删除,都会触发监听
*/
zkClient.subscribeChildChanges("/sys-zkclient-get", new IZkChildListener() {
/*
s : parentPath
list : 变化后子节点列表
*/
public void handleChildChange(String parentPath, List<String> list) throws Exception {
System.out.println(parentPath + "的子节点列表发生了变化,变化后的子节点列表为"+ list);
}
});
//测试
zkClient.createPersistent("/sys-zkclient-get");
Thread.sleep(1000);
zkClient.createPersistent("/sys-zkclient-get/c1");
Thread.sleep(1000);
}
}
运行结果:
/zk-book 's child changed, currentChilds:[]
/zk-book 's child changed, currentChilds:[c1]
/zk-book 's child changed, currentChilds:[]
/zk-book 's child changed, currentChilds:null
结果表明∶
客户端可以对一个不存在的节点进行子节点变更的监听。
一旦客户端对一个节点注册了子节点列表变更监听之后,那么当该节点的子节点列表发生变更时,服务端都会通知客户端,并将最新的子节点列表发送给客户端
该节点本身的创建或删除也会通知到客户端。
7. 获取数据(节点是否存在、更新、删除)
package com.study.zkclient;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
public class Note_API {
/*
借助zkclient完成会话的创建
*/
public static void main(String[] args) throws InterruptedException {
/*
创建一个zkclient实例就可以完成连接,完成会话的创建
serverString : 服务器连接地址
注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
*/
ZkClient zkClient = new ZkClient("39.106.101.9:2181");
System.out.println("会话被创建了..");
// 判断节点是否存在
String path = "/sys-zkClient-Ep";
boolean exists = zkClient.exists(path);
if(!exists){
// 创建临时节点
zkClient.createEphemeral(path,"123");
}
// 读取节点内容
Object o = zkClient.readData(path);
System.out.println(o);
// 注册监听
zkClient.subscribeDataChanges(path, new IZkDataListener() {
/*
当节点数据内容发生变化时,执行的回调方法
s: path
o: 变化后的节点内容
*/
public void handleDataChange(String s, Object o) throws Exception {
System.out.println(s+"该节点内容被更新,更新的内容"+o);
}
/*
当节点被删除时,会执行的回调方法
s : path
*/
public void handleDataDeleted(String s) throws Exception {
System.out.println(s+"该节点被删除");
}
});
// 更新节点内容
zkClient.writeData(path,"456");
Thread.sleep(1000);
// 删除节点
zkClient.delete(path);
Thread.sleep(1000);
}
}
运行结果:
123
/sys-zkClient-Ep该节点内容被更新,更新后的内容4567
/sys-zkClient-Ep 该节点被删除
结果表明可以成功监听节点数据变化或删除事件。