1

创建路径时,我在以下代码中收到 NodeExists 错误。

CuratorTransaction transaction = curatorFramework.inTransaction();
transaction.create().forPath("/foo")
        .and().create().forPath("/foo/123")
        .and().create().forPath("/foo")
        .and().commit();

因此,在此它试图在第一次创建后再次创建 foo 。有什么办法可以在创建路径时检查事务的状态,以便在事务 /foo create 中存在,然后它不会再次创建。

4

1 回答 1

1

简短的回答是否定的,无法检查您是否尝试两次创建路径。原因是您将整个“blob”作为一个事务提交给zookeeper,这在广义上意味着每个操作都将同时完成。

至少有两种不同的方法可以解决这个问题,或者将每个操作作为单独的操作发送,在这种情况下,您可以这样做:

if(curatorFramework.checkExists().forPath("/foo") == null){
  curatorFramework.create().forPath("/foo");
}

或者,如果您的应用程序使用事务很重要,那么您的应用程序必须控制它不会将两个冲突的操作放在一个事务中。例如,使用在路径上索引的 HashMap。

另外,CuratorTransaction 已被弃用,因此您应该改用CuratorFramework.transaction()

于 2016-03-09T11:01:08.117 回答