packagecom.zhi.test;importjava.util.List;importorg.apache.logging.log4j.LogManager;importorg.apache.logging.log4j.Logger;importorg.apache.zookeeper.CreateMode;importorg.apache.zookeeper.WatchedEvent;importorg.apache.zookeeper.Watcher;importorg.apache.zookeeper.ZooDefs.Ids;importorg.apache.zookeeper.ZooKeeper;importorg.apache.zookeeper.data.Stat;importorg.junit.jupiter.api.AfterAll;importorg.junit.jupiter.api.BeforeAll;importorg.junit.jupiter.api.MethodOrderer;importorg.junit.jupiter.api.Order;importorg.junit.jupiter.api.Test;importorg.junit.jupiter.api.TestInstance;importorg.junit.jupiter.api.TestInstance.Lifecycle;importorg.junit.jupiter.api.TestMethodOrder;/*** Zookeeper操作测试
*
*@author张远志
*@since2020年5月3日14:31:28
**/@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)public classZookeeperTest {private final Logger logger = LogManager.getLogger(this.getClass());privateZooKeeper zooKeeper;private final String path = "/test";
@BeforeAllpublic void init() throwsException {
zooKeeper= new ZooKeeper("192.168.59.131:2181", 60000, newWatcher() {public voidprocess(WatchedEvent event) {
logger.info("事件类型:{},路径:{}", event.getType(), event.getPath());
}
});
}/*** 添加数据,当路径已经存在时会报错,初始版本号为0。第三个参数是权限控制。
* 第四个参数,CreateMode:
*
PERSISTENT:持久化保存*
PERSISTENT_SEQUENTIAL:持久化保存,并且路径附加一个自动增长的序号*
EPHEMERAL:临时数据,客户端断开连接时自动删除数据(dubbo就是采用这种机制)*
EPHEMERAL_SEQUENTIAL:客户端断开连接时自动删除数据,并且路径会附加一个自动增长的序号*
CONTAINER:*
PERSISTENT_WITH_TTL:客户端断开连接时自动删除数据,当节点在指定时间没有被修改且没有子目录时,数据会被删除*
PERSISTENT_SEQUENTIAL_WITH_TTL:客户端断开连接时自动删除数据,路径会附加一个自动增长的序号,且当节点在指定时间没有被修改且没有子目录时,数据会被删除*/@Order(1)@Testpublic voidcreate() {try{
String back= zooKeeper.create(path, "这是一个测试".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
logger.info("添加一条数据成功,实际路径:{}", back);
}catch(Exception e) {
logger.error("调用create出错", e);
}
}/*** 判断路径是否存在,不存在时返回null*/@Order(2)
@Testpublic voidexists() {try{
Stat stat= zooKeeper.exists(path, false);
logger.info("路径为{}的节点{}存在", path, stat == null ? "不" : "");
}catch(Exception e) {
logger.error("调用exists出错", e);
}
}/*** 查询数据,路径不存在时会报错*/@Order(3)
@Testpublic voidfind() {try{byte[] bits = zooKeeper.getData(path, false, new Stat()); //路径不存在时会报错
String data = newString(bits);
logger.info("路径{}查询到数据:{}", path, data);
}catch(Exception e) {
logger.error("调用getData出错", e);
}
}/*** 获取子目录,结果为空时返回一个长度为0的ArrayList*/@Order(3)
@Testpublic voidchildren() {try{
List list = zooKeeper.getChildren(path, false);
logger.info("路径{}的子目录有:{}", path, String.join("、", list.toArray(new String[0])));
}catch(Exception e) {
logger.error("调用getChildren出错", e);
}
}/*** 修改数据,路径不存在时会报错,版本号与存储中不一致时也报错*/@Order(4)
@Testpublic voidudpate() {try{
Stat stat= zooKeeper.exists(path, false);if (stat != null) {
stat= zooKeeper.setData(path, "这是一个修改测试".getBytes(), stat.getVersion()); //版本号为-1时不做版本校验
logger.info("数据修改成功,原版本号:{},新版本号:{}", stat.getAversion(), stat.getVersion());
}
}catch(Exception e) {
logger.error("调用setData出错", e);
}
}/*** 删除节点,路径不存在时报错,版本号不一致时也会报错*/@Order(5)
@Testpublic voiddelete() {try{
zooKeeper.delete(path,-1); //-1表示不做版本校验
logger.info("根据path删除数据成功");
}catch(Exception e) {
logger.error("调用delete出错", e);
}
}
@AfterAllpublic void destory() throwsException {if (zooKeeper != null) {
zooKeeper.close();
}
}
}