Представьте путь "/root/child1/child2/child3"
Представьте себе в zookeeper, что, возможно, часть этого существует, скажем: "/root/child1"
В zookeeper нет эквивалента "mkdir -p"; Кроме того, ZooKeeper.multi() не удастся, если какая-либо операция завершится неудачей, поэтому "make path" не может быть переработана в многопользовательском вызове. Кроме того, у вас может быть другой клиент, пытающийся сделать один и тот же путь...
Это то, что я придумал для создания пути. Интересно, стоит ли даже проверять, существует ли какая-либо часть или нет, чтобы сохранить обратный вызов вызова exists().
//String[] pathParts new String[] { "root", "child1", "child2", "child3" };
public void savePath(String[] pathParts) {
if (zooKeeper.exists(pathString, false) != null) return;
StringBuilder path = new StringBuilder();
for (String pathElement : pathParts) {
path.append(UNIX_FILE_SEPARATOR).append(pathElement);
String pathString = path.toString();
try {
//bother with the exists call or not?
if (zooKeeper.exists(pathString, false) == null) {
zooKeeper.create(pathString, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
} catch (KeeperException e) {
if (e.code() != KeeperException.Code.NODEEXISTS)
throw e;
}
}
}
Каким будет самый эффективный способ сделать это? Предполагая, что a) вы заранее не знаете, какая часть пути уже существует, и б) какой-то другой клиент может попытаться написать тот же путь (и мы хотим избежать блокировки).