2016-08-06 7 views
1

私は現在、データにアクセスするための単一の飼育係ノードとキュレーターを持つ設定を持っています。データの読み込みは、キュレーターTreeCacheを介して行われます。テストが実行される前に、「で、new_nodeは」存在しないことをZookeeperが連続した変更でイベントを逃した

public void test_callback_successive_changes_success_global_new_version() throws InterruptedException { 

    ZookeeperTestsHelper.createNewNodeInZookeeperSingleCommand("/my/path/new_node", "some string4", curator); 
    ZookeeperTestsHelper.createNewNodeInZookeeperSingleCommand("/my/path/new_node", "some string5", curator); 

    Thread.sleep(1000); 
    assertThat(<check what events the listener heard>); 
} 

注:

は、私は次のテストを持っています。

public static void createNewNodeInZookeeperSingleCommand(final String fullPathOfValueInZookeeper, final String valueToSet, final CuratorFramework curator) { 
    try { 
     if (curator.checkExists().forPath(fullPathOfValueInZookeeper) != null) { 
      System.out.println("E: " + valueToSet); 
      //Node already exists just set it 
      curator.setData().forPath(fullPathOfValueInZookeeper, valueToSet.getBytes()); 
     } else { 
      System.out.println("N: " + valueToSet); 
      //Node needs to be created 
      curator.create().creatingParentsIfNeeded().forPath(fullPathOfValueInZookeeper, valueToSet.getBytes()); 
     } 
    } catch (Exception e) { 
     throw new IllegalStateException("Error", e); 
    } 
} 

私はキャッシュリスナーが最初の「いくつかの文字列4」で追加されたノードのイベントを聞いた後、「いくつかの文字列5」で更新ノードの別のイベントを聞いただろうことを期待しています。

代わりに私が唯一、両方のコマンドが実行されているログを見てみると、「いくつかの文字列5」

値が追加されたノードのためのイベントを受け付けております。すなわち「N:ある文字列4」と「E:ある文字列5」の両方が記録される。そして、Zookeeperの最終的な値は正しいです( "some string 5")が、なぜキュレーターのキャッシュが1つのイベントしか見ていないのか分かりません。

答えて

1

ZooKeeper(またはCurator's TreeCache)は、連続した変更でイベントが発生しないことを保証しません。保証は、あなたが他のクライアントが見るものとは異なる順序で連続的な変更を見ることができないことです。

関連する問題