Zookeeper的API应用之非空节点的删除
除了在linux中用命令行方式(deleteall 非空目录)删除,也可以在idea中代码实现非空节点的删除
//创建测试类
public class TestZKClient {
//声明ZooKeeper,方便调用
private ZooKeeper zk;
//测试方法
@Test
public void delAllNode() throws KeeperException, InterruptedException {
testDelNodes("/sanguo",zk);
}
/**
* (核心代码)递归删除非空节点方法
*/
public void testDelNodes(String path,ZooKeeper zk) throws KeeperException, InterruptedException {
Stat stat = zk.exists(path, false);
//判断传入的节点状态,非空进入
if (stat != null) {
System.out.println(path+" 存在");
//先获取子节点
List<String> chilNode = zk.getChildren(path, false);
//递归删除节点,获取到的子节点集合非空进入
if(chilNode!=null&&chilNode.size()>0){ //此判断内部如果不写删除语句,可以保留顶级父节点
for (String nodeVal : chilNode) {
//递归子节点
testDelNodes(path+"/"+nodeVal,zk);
}
//删除本节点,这里不写能够保留根节点
zk.delete(path,stat.getVersion());
}else {
//删除空节点
zk.delete(path,stat.getVersion());
}
}else {
System.out.println(path+" 不存在");
}
}
连接Zookeeper客户端
连接成功
/sanguo 目录下有三个子节点
执行测试delAllNode()方法程序
测试结果
Zookeeper中已经删除了/sanguo的非空节点
值得一提,如果想要保留根节点可将这句删除
还需要注意对节点集合的判断条件,如果不小心设为chilNode!=null,判断条件就是永真,因为即使当前节点没有子节点,getChildren返回的集合chilNode里面没有值,chilNode.size()=0但是chilNode不为空,所以永真,此时就永远不会执行else,遍历到一个空节点就删除,最终删除所有节点(保留不下根节点)
//先获取子节点
List<String> chilNode = zk.getChildren(path, false);
//递归删除节点,获取到的子节点集合非空进入
if(chilNode!=null)
本文内容知识点如果存在什么问题,欢迎各路大佬指正。