Zookeeper作为分布式的协调者,应用越来越广泛。
Zookeeper在删除含有子节点的时候,会爆出 KeeperException.NotEmpty。
找了原始的Zookeeper API 和 Curator框架都是这么抛的异常。
所以不得不手动递归删除节点,代码如下:
private void doDelZnodeRecursively(String path) {
try {
List<String> childList = client.getChildren().forPath(path);
if (CollectionUtils.isEmpty(childList)) {
client.delete().forPath(path);
} else {
for(String childName: childList) {
String childPath = path + Constants.STR_SLASH + childName;
List<String> grandChildList = client.getChildren().forPath(childPath);
if (CollectionUtils.isEmpty(grandChildList)) {
client.delete().forPath(childPath);
} else {
doDelZnodeRecursively(childPath);
}
}
client.delete().forPath(path);
}
} catch (Exception e) {
throw new RuntimeException("Failed to delete node recursively", e);
}
}