在Zookeeper节点上调用getChildren时忽略锁定节点

时间:2014-08-26 13:21:07

标签: java apache-zookeeper apache-curator

当我在带有策展人的Zookeeper节点上调用getChildren()时,有没有办法忽略代表锁定的子节点?

我想用一个特定节点的数据读取所有孩子。因此,我首先调用getChildren()并迭代返回的List并在每个这样的子节点上调用getData()。为了避免孩子们在两者之间发生变化,我首先需要一个InterProcessMutex。不幸的是,孩子列表中也包含这个互斥锁。

InterProcessMutex mutex = new InterProcessMutex(client, parentNodePath);

mutex.acquire();

try {
  List<String> children = client.getChildren().forPath(parentNodePath);

  for (String child : children) {
    // do something
    // ignore the lock-node
  }

} finally {
  mutex.release();
}

有更聪明的方法吗?或者只是忽略锁节点?

1 个答案:

答案 0 :(得分:0)

为锁定节点使用不同的基础,这样实际数据就不会与锁定数据混合。锁不必知道它们锁定的内容,因此不需要为同一父基提供锁机制。

InterProcessMutex mutex = new InterProcessMutex(client, "/lock-base/lock-");

然后以与你相同的方式完成剩下的工作

mutex.acquire();

try {
  List<String> children = client.getChildren().forPath(parentNodePath);

  for (String child : children) {
    // do something
    // no need to worry about lock nodes
  }

} finally {
  mutex.release();
}

请确保为尝试访问parentNodePath的所有应用程序使用相同的锁定节点库,并且您很好。