必看:https://www.cnblogs.com/shay-zhangjin/p/7781017.html
工具类
package com.everyday.helloworld.zoo;
import java.util.List;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.serialize.SerializableSerializer;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
public class ZkClientUtil {
private static final String zkServers = "192.168.198.100:2181";
private static final int sessionTimeout = 5000;
private static final int connectionTimeout = 5000;
/**
* 1)和zookeeper原生API不同,通过zkclient API创建会话,需要提供session timout, connection timeout两个定时器
* 2)同时要提供1个序列化器实例,原因在于后续创建znode节点时,写入的数据(java对象)会自动通过序列化器来转换为byte[]
* 3)同理,读取出的byte[]的数据,也会自动通过序列化器直接转换为Java对象
*/
// 创建znode节点
public static ZkClient createClient() {
ZkClient zkClient = new ZkClient(zkServers, sessionTimeout, connectionTimeout, new SerializableSerializer());
System.out.println("ZkClientUtil: ZkClient Connection OK!");
return zkClient;
}
public static String createZnode(ZkClient zkClient, Object obj) {
//直接将实例obj写入,自动通过序列化为byte[]
String nodePath = zkClient.create("/node_zkclient", obj, CreateMode.PERSISTENT);
System.out.println("ZkClientUtil: Create path is: " + nodePath);
return nodePath;
}
// 修改节点数据
public static void updateZnode(ZkClient zkClient, String nodePath, Object obj) {
//直接写入实例,自动通过连接创建时创建的序列化实例,转换为byte[]
System.out.println("ZkClientUtil: updateZnode begin obj=" + obj);
zkClient.writeData(nodePath, obj);
}
// 获取节点数据
public static Object getZnodeData(ZkClient zkClient, String nodePath) {
Stat stat = new Stat();
Object obj = zkClient.readData(nodePath, stat);
if (obj == null) {
System.out.println("ZkClientUtil: getZnodeData ,Node doesn't exist!");
return null;
} else {
return obj;
}
}
// 获取子节点列表
public static void getZnodeChildren(ZkClient zkClient, String nodePath) {
List<String> children_list = zkClient.getChildren(nodePath);
//打印子节点列表
System.out.println("Children list of /node_zkclient is : " + children_list.toString());
}
// 删除节点
public static void delZnode(ZkClient zkClient, String nodePath) {
//delete node without children
// boolean e1 = zkClient.delete(nodePath);
// System.out.println("Delete node without children: " + e1);
// delete node and all children
boolean e2 = zkClient.deleteRecursive(nodePath);
System.out.println("Delete node and children: " + e2);
}
// 判断节点是否存在
public static boolean isZnodeExist(ZkClient zkClient, String nodePath) {
boolean exist = zkClient.exists(nodePath);
System.out.println("Node exist status is: " + exist);
return exist;
}
// 订阅子节点列表发生变化
public static void subscribeChildChanges(ZkClient zkClient, String nodePath) {
// subscribe children change event, multiple subscribe
List<String> results = zkClient.subscribeChildChanges(nodePath, new ZkChildListener());
System.out.println("ZkClientUtil: results=" + results);
// sleep until receive event notify
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
package com.everyday.helloworld.zoo;
import java.util.List;
import org.I0Itec.zkclient.IZkChildListener;
public class ZkChildListener implements IZkChildListener {
@Override
public void handleChildChange(String parentZnodePath, List<String> list) throws Exception {
//print parent path
System.out.println("ZkChildListener parentZnodePath: " + parentZnodePath);
//print current children
System.out.println("ZkChildListener Current children: " + list.toString());
}
}