package com.ilike.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.SerializableSerializer;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
import org.junit.Test;
/**
* zookeeper的开源客户端zkclent的使用
* 创建,删除,修改,读取节点, 获取子节点,判断节点是否存在,监听节点变化,监听子节点变化
*
* @author 桑伟东
*
*/
public class TestZkClient {
/**
* 1. 创建一个zkClient对象
* 第一个参数:服务器的ip地址
* 第二个参数:会话超时时间
* 第三个参数:连接超时时间
* 第四个参数:序列化器,为了直接将对象存入和取出
*/
ZkClient zkClient = new ZkClient(“192.168.111.129:2181”, 10000, 10000, new SerializableSerializer());
/**
* 创建节点
*/
@Test
public void TestCreateNode() {
// 2.创建一个持久的数据节点,并存放一个Student对象
Student student = new Student();
student.setAge(23);
student.setName("桑伟东");
// 返回创建的节点的路径
String path = zkClient.create("/node_6", student, CreateMode.PERSISTENT);
System.out.println(path);
}
/**
* 读取节点
*/
@Test
public void TestGetData() {
// 因为SerializableSerializer的存在,zkclient已经将底层的数据转化为student对象
// Student student=zkClient.readData("/node_6");
// 读取数据的同时我们换可以获取该对象的状态信息,如果要获取状态信息,需要传入一个stat对象
Stat stat = new Stat();
Student student = zkClient.readData("/node_6", stat);
System.out.println(student);
// zkclient会将该节点的状态信息封装在stat对象中
System.out.println(stat);
}
/**
* 获取子节点
*/
@Test
public void TestGetChild() {
// 获取子节点的列表
List<String> childs = zkClient.getChildren("/");
System.out.println(childs.toString());
}
/**
* 删除节点
*/
@Test
public void TestDelNode() {
// 删除节点(没有子节点),返回一个布尔值,表示删除成功与否
Boolean e = zkClient.delete("/node_9");
System.out.println(e);
// 删除节点(有子节点),返回一个布尔值,表示删除成功与否
Boolean e2 = zkClient.deleteRecursive("/node_1");
System.out.println(e2);
}
/**
* 判断节点是否存在
*/
@Test
public void TestNodeExists() {
// 判断某一节点是否存在,返回一个布尔值
boolean flag = zkClient.exists("/node_8");
System.out.println(flag);
}
/**
* 修改节点数据
*/
@Test
public void TestWriteData() {
// 修改节点的数据
Student student = new Student();
student.setAge(22);
student.setName("xpy");
// 修改数据,不校验版本号
zkClient.writeData("/node_6", student);
// 修改数据,校验版本号
zkClient.writeData("/node_6", student, 1);
}
/**
* 实现节点数据变化监听的类
*
* @author 桑伟东
*
*/
private static class ZkDataListener implements IZkDataListener {
/**
* 节点的数据发生改变
*/
public void handleDataChange(String dataPath, Object data) throws Exception {
// TODO Auto-generated method stub
System.out.println(dataPath + data);
}
/**
* 节点被删除
*/
public void handleDataDeleted(String dataPath) throws Exception {
// TODO Auto-generated method stub
System.out.println(dataPath);
}
}
/**
* 订阅节点数据变化的通知
*
* @throws InterruptedException
*/
@Test
public void TestSubscribeDataChanges() throws InterruptedException {
zkClient.subscribeDataChanges("/node_10", new ZkDataListener());
Thread.sleep(Integer.MAX_VALUE);
}
/**
* 实现子节点变化监听的类
*
* @author 桑伟东
*
*/
private static class ZkChildListener implements IZkChildListener {
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
// TODO Auto-generated method stub
System.out.println("节点路径:" + parentPath);
System.out.println("子节点列表:" + currentChilds);
}
}
/**
* 订阅子节点变化的通知
*
* @throws InterruptedException
*/
@Test
public void TestSubscribeChildChanges() throws InterruptedException {
/*
* 监听node_6节点的子节点列表的变化,传入一个实现了IZkChildListener监听器接口的类的对象
* 这里不光能监听到子节点的创建和删除引起的子节点列表发生变化的事件,换能监听到节点本身的创建和删除 也就是说,这里可以监听一个并不存在的节点
*/
zkClient.subscribeChildChanges("/node_10", new ZkChildListener());
Thread.sleep(Integer.MAX_VALUE);
}
}