1

キュレーターを使用して Zookeeper ノードで getChildren() を呼び出す場合、ロックを表す子ノードを無視する方法はありますか?

特定の 1 つのノードのデータを使用して、すべての子を読み取りたいと考えています。したがって、最初に 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 に答える