ZkClient是Github上一个开源的Zookeeper客户端。ZkClient在Zookeeper原生的API接口上进行了封装,是一个更加易用的Zookeeper哭护短。同时ZkClient在内部实现了诸如Session超时重连、Watcher反复注册等功能。
添加依赖:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.6</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency>
创建获取zkclient的工具类:
package com.zkclient;
import org.I0Itec.zkclient.ZkClient;
public class ZkClientTool {
/**
* 获取zkClien
* @return
*/
public static ZkClient getZkClient() {
//获取zkclent new SerializableSerializer()是序列化器,可以直接传入对象,也可以直接读取,序列化器为我们完成序列化和反序列化
ZkClient zkClient = new ZkClient("192.168.40.135:2181", 10000, 500000, new MySerializer());
return zkClient;
}
}
创建节点:
package com.zkclient;
import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.CreateMode;
public class CreateNode {
public static void main(String[] args) {
ZkClient zkCliet = ZkClientTool.getZkClient();
User user = User.builder().id(1).name("zzz").build();
String path = zkCliet.create("/node_2", user, CreateMode.PERSISTENT);
System.out.println(path);
}
}
获取节点值:
package com.zkclient;
import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.data.Stat;
public class GetNodeData {
public static void main(String[] args) {
ZkClient zkCliet = ZkClientTool.getZkClient();
//如果获取节点状态,将stat作为参数传入即可
Stat stat = new Stat();
String user = zkCliet.readData("/node_2", stat);
System.out.println("user:" + user);
System.out.println("stat" + stat);
}
}
获取子节点信息:
package com.zkclient;
import org.I0Itec.zkclient.ZkClient;
import java.util.List;
public class GetChildNode {
public static void main(String[] args) {
ZkClient zkCliet = ZkClientTool.getZkClient();
List<String> children = zkCliet.getChildren("/node_2");
System.out.println("children" + children.toString());
}
}
检测某个节点是否存在:
package com.zkclient;
import org.I0Itec.zkclient.ZkClient;
public class NodeExits {
public static void main(String[] args) {
ZkClient zkCliet = ZkClientTool.getZkClient();
boolean exists = zkCliet.exists("/node_2");
System.out.println("exists:" + exists);
}
}
删除节点:
package com.zkclient;
import org.I0Itec.zkclient.ZkClient;
public class DeleteNode {
public static void main(String[] args) {
ZkClient zkCliet = ZkClientTool.getZkClient();
boolean node_2 = zkCliet.delete("node_2");
System.out.println("delete node_2:" + node_2);
//如果节点有子节点,使用deleteRecursive循环删除
boolean node_21 = zkCliet.deleteRecursive("node_2");
System.out.println("contains child delete node_21:" + node_21);
}
}
如果有子节点会报错:
需要用deleteRecursive删除:
节点修改:
package com.zkclient;
import org.I0Itec.zkclient.ZkClient;
public class WriteData {
public static void main(String[] args) {
ZkClient zkCliet = ZkClientTool.getZkClient();
Object oldDate = zkCliet.readData("/node_1");
System.out.println("oldDate:" + oldDate);
zkCliet.writeData("/node_1", "zkca");
Object newDate = zkCliet.readData("/node_1");
System.out.println("newDate:" + newDate);
}
}
事件订阅:
可以订阅两种事件:
1.节点的子节点列表发生变化
2.节点本身数据发生变化
首先看节点的子节点的变化的事件订阅
package com.zkclient;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
import java.util.List;
public class SubScribeChildChange {
private static class ZkChildChangeListener implements IZkChildListener {
public void handleChildChange(String parentPath, List<String> childrenList) throws Exception {
System.out.println("parentPath:" + parentPath);
System.out.println("childrenList:" + childrenList.toString());
}
}
public static void main(String[] args) throws InterruptedException {
ZkClient zkCliet = ZkClientTool.getZkClient();
//可以监听:给node_1添加子节点、删除子节点甚至node_1节点本身的创建和删除
zkCliet.subscribeChildChanges("/node_1", new ZkChildChangeListener());
Thread.sleep(Integer.MAX_VALUE);
}
}
删除该节点下的子节点:
删除本身节点:
创建本身节点:
节点本身数据发生变化的事件订阅:
package com.zkclient;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
public class SubScribeDateChange {
private static class ZkChildChangeListener implements IZkDataListener {
public void handleDataChange(String datePath, Object date) throws Exception {
System.out.println("datePath:" + datePath);
System.out.println("date:" + date);
}
public void handleDataDeleted(String s) throws Exception {
//触发删除的事件通知:
System.out.println("s:" + s);
}
}
public static void main(String[] args) throws InterruptedException {
ZkClient zkCliet = ZkClientTool.getZkClient();
//可以监听:给node_1添加子节点、删除子节点甚至node_1节点本身的创建和删除
zkCliet.subscribeDataChanges("/node_1", new ZkChildChangeListener());
Thread.sleep(Integer.MAX_VALUE);
}
}
修改节点值:
输出: