Игнорировать узлы блокировки при вызове getChildren на узле Zookeeper

Когда я вызываю getChildren() на узле Zookeeper с куратором, есть ли способ игнорировать дочерние узлы, представляющие блокировку?

Я хочу прочитать всех детей с их данными одного конкретного узла. Поэтому я сначала вызываю getChildren(), перебираю возвращенный список и вызываю 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();
}

Есть ли более разумный способ сделать это? Или просто игнорировать узел блокировки?


person Tobel    schedule 26.08.2014    source источник
comment
Во всяком случае, это не работает, даже если я вручную отфильтрую дочерние блоки. Это зависает после 1-2 раз создания узла с разными клиентами. Возможно, я сталкиваюсь с бесконечным циклом, потому что получение и освобождение блокировки таким образом запускает getChildren-watchers на всех других клиентах, которые также пытаются получить мьютекс и так далее. Когда я удаляю мьютекс, все работает как положено.   -  person Tobel    schedule 27.08.2014


Ответы (1)


Используйте другую базу для узлов блокировки, чтобы фактические данные не смешивались с данными блокировки. Замки не должны знать, что они блокируют, поэтому нет необходимости давать механизму блокировки одну и ту же родительскую базу.

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, и все в порядке.

person Sunny    schedule 15.08.2016