1

パスの作成中に、次のコードで NodeExists エラーが発生します。

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

したがって、これでは、最初に foo を作成した後、2 回目に foo を作成しようとしています。パスを作成するときにトランザクションの状態を確認して、トランザクション /foo create に存在するようにする方法はありますか?

4

1 に答える 1

1

簡単に言えばいいえです。パスを 2 回作成しようとしているかどうかを確認することはできません。その理由は、'blob' 全体を 1 つのトランザクションとして Zookeeper にコミットしているためです。これは、広い意味で、すべての操作が同時に行われることを意味します。

これを解決するには、少なくとも 2 つの異なる方法があります。すべての操作を個別の操作として送信するか、その場合は次のようにします。

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

または、トランザクションを使用することがアプリケーションにとって重要な場合、アプリケーションは、2 つの競合する操作を 1 つのトランザクションに入れないように制御する必要があります。たとえば、パスにインデックス付けされた HashMap を使用します。

補足として、 CuratorTransaction は非推奨であるため、代わりにCuratorFramework.transaction()を使用する必要があります。

于 2016-03-09T11:01:08.117 に答える