Представьте себе путь "/ root / child1 / child2 / child3"
Вообразите в zookeeper, что, возможно, часть этого существует, скажем "/ root / child1"
В zookeeper нет эквивалента "mkdir -p"; Кроме того, ZooKeeper.multi () завершится ошибкой, если произойдет сбой какой-либо одной операции, поэтому «путь создания» действительно не может быть включен в мульти-вызов. Кроме того, у вас может быть другой клиент, пытающийся создать тот же путь ...
Это то, что я придумал для создания пути. Интересно, стоит ли даже проверять, существует ли деталь, или нет, чтобы сохранить двустороннюю связь с существующим вызовом ().
//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;
}
}
}
Какой самый эффективный способ сделать это? Предполагая, что: а) вы не знаете заранее, какая часть пути уже существует, и б) какой-то другой клиент может пытаться написать этот же путь (и мы хотим избежать блокировки).