想象一下,一個路徑 「/根/ child1 /的child2/child3」在zookeeper中創建路徑的最有效方法,其中路徑的根元素可能存在也可能不存在?
試想一下,動物園管理員,也許這項工作的一部分存在,說 「/根/ child1」
不存在「的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)事先不知道有多少路徑已經存在,b)某個其他客戶端可能正在嘗試寫入相同的路徑(並且我們希望避免鎖定)。
的請求響應1你能舉例說明實例變量路徑包含什麼以及傳遞給pathParts參數的內容?將代碼作爲追溯到自身的路徑有點困惑。 – 2012-03-28 00:46:12
對不起 - 有一些錯誤。現在修正,或多或少。 – marathon 2012-03-28 01:47:48