1

当我在带有 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();
}

有没有更聪明的方法来做到这一点?或者只是忽略锁定节点?

4

1 回答 1

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 的应用程序使用相同的锁节点库,你就很好了。

于 2016-08-15T08:24:41.133 回答