简介
ZKClient是Github上的一个开源的Zookeeper客户端,他在原生API接口上做了包装;同时在内部实现了诸如Session超时重连、Watcher反复注册等功能。
引入依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.5</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
创建与关闭连接
private String zkServers = "192.168.1.201:2181";
private int connectionTimeout = 10000;
private ZkClient client;
@Before
public void init() {
client = new ZkClient(zkServers, connectionTimeout);
System.out.println("连接创建成功");
}
@After
public void close() {
client.close();
System.out.println("连接关闭成功");
}
创建节点
@Test
public void createTest() {
// 创建持久节点
client.createPersistent("/h", "1");
System.out.println("创建持久节点完成");
// 创建持久顺序节点
String node2 = client.createPersistentSequential("/i", "2");
System.out.println("创建持久顺序节点: " + node2);
// 创建临时节点
client.createEphemeral("/j", "3");
System.out.println("创建临时节点完成");
// 创建临时顺序节点
String node4 = client.createEphemeralSequential("/k", "4");
System.out.println("创建临时顺序节点: " + node4);
// 创建节点时,如果父节点不存在则同时创建父节点
client.createPersistent("/L/L1/L11",true);
// 创建节点,不传值,默认为null
client.createPersistent("/m");
}
获取子节点
@Test
public void getChildrenTest() {
// 获取子节点
System.out.println(client.getChildren("/"));
}
获取子节点(动态刷新)
@Test
public void getChildren2Test() throws Exception {
// 获取子节点
client.subscribeChildChanges("/h", new IZkChildListener() {
public void handleChildChange(String parentPath, List<String> currentChilds) {
System.out.println("------子节点列表发生变化------");
System.out.println(currentChilds);
System.out.println("------------");
}
});
Thread.sleep(Integer.MAX_VALUE);
}
1、当创建节点/h/h1时
自动输出以下内容:
2、当删除节点/c/c1时,自动输出以下内容:
查询节点数据
@Test
public void readDataTest() {
// 查询节点数据
System.out.println(client.readData("/h"));
}
查询节点数据(动态)
@Test
public void readData2Test() throws Exception{
client.subscribeDataChanges("/h", new IZkDataListener() {
@Override
public void handleDataChange(String dataPath, Object data) {
System.out.println("节点" + dataPath + " 数据变更为:" + data);
}
@Override
public void handleDataDeleted(String dataPath) {
System.out.println("节点 " + dataPath + " 被删除");
}
});
Thread.sleep(Integer.MAX_VALUE);
}
修改节点数据
@Test
public void writeDataTest() {
// 修改节点数据
client.writeData("/h","1-1");
}
删除节点
@Test
public void deleteTest() {
// 删除节点
client.delete("/h");
}