删除分组

下面让我们来看一下如何删除一个分组?

ZooKeeper的API提供一个delete()方法来删除一个znode。我们通过输入znode的path和版本号(version number)来删除想要删除的znode。我们除了使用path来定位我们要删除的znode,还需要一个参数是版本号。只有当我们指定要删除的本版号,与znode当前的版本号一致时,ZooKeeper才允许我们将znode删除掉。这是一种optimistic locking机制,用来处理znode的读写冲突。我们也可以忽略版本号一致检查,做法就是版本号赋值为-1。

删除一个znode之前,我们需要先删除它的子节点,就下如下代码中实现的那样:

  1. public class DeleteGroup extends ConnectionWatcher {
  2. public void delete(String groupName) throws KeeperException,
  3. InterruptedException {
  4. String path = "/" + groupName;
  5. try {
  6. List<String> children = zk.getChildren(path, false);
  7. for (String child : children) {
  8. zk.delete(path + "/" + child, -1);
  9. }
  10. zk.delete(path, -1);
  11. } catch (KeeperException.NoNodeException e) {
  12. System.out.printf("Group %s does not exist\n", groupName);
  13. System.exit(1);
  14. }
  15. }
  16. public static void main(String[] args) throws Exception {
  17. DeleteGroup deleteGroup = new DeleteGroup();
  18. deleteGroup.connect(args[0]);
  19. deleteGroup.delete(args[1]);
  20. deleteGroup.close();
  21. }
  22. }

最后我们执行如下操作来删除zoo group:

  1. % java DeleteGroup localhost zoo
  2. % java ListGroup localhost zoo
  3. Group zoo does not exist