2016-06-15 9 views
2

Wie kann ich bei Verwendung des Kurators treeCache sicherstellen, dass der Cache bereit ist?Wie kann ich mit curator treeCache sicherstellen, dass der Cache bereit ist?

Nach cache.start(), wenn ich getCurrentData sofort anrufen, wird es zurückgeben null, so wie kann ich sicherstellen, Cache ist bereit ?, kann mir jemand ein Beispiel geben?

Dank
client = CuratorFrameworkFactory.builder() 
      .connectString(connectionString) 
      .retryPolicy(new ExponentialBackoffRetry(zkConnectionTimeoutMs, 3)) 
      .sessionTimeoutMs(zkSessionTimeoutMs) 
      .build(); 
client.start(); 

cache = new TreeCache(client, rootPath); 
cache.start(); 
ChildData child = cache.getCurrentData(rootPath); // child is null 
Thread.sleep(50); // must sleep for a while 
child = cache.getCurrentData(rootPath); // child is ok 

Antwort

1

Sie könnten einen Listener für Treecycache hinzufügen und auf das INITIALIZED-Ereignis warten.

Semaphore sem = new Semaphore(0); 
    client = CuratorFrameworkFactory.builder() 
           .connectString(connectionString) 
           .retryPolicy(new ExponentialBackoffRetry(zkConnectionTimeoutMs, 3)) 
           .sessionTimeoutMs(zkSessionTimeoutMs) 
           .build(); 
     client.start(); 

     cache = new TreeCache(client, rootPath); 
        cache.start(); 

     TreeCacheListener listener = new TreeCacheListener() { 

            @Override 
            public void childEvent(CuratorFramework client, TreeCacheEvent event) 
              throws Exception { 
             switch (event.getType()) { 
             case INITIALIZED: { 

              sem.release(); 

             } 

            } 

           }; 
     cache.getListenable().addListener(listener); 
     sem.acquire(); 
child = cache.getCurrentData(rootPath); 
+0

jemand gefunden bessere Lösung als dies? –

1

aus dem Code of getCurrentChildren

public Map<String, ChildData> getCurrentChildren(String fullPath) 
{ 
    TreeNode node = find(fullPath); 
    if (node == null || node.nodeState.get() != NodeState.LIVE) 
    { 
     return null; 
    } 
    ConcurrentMap<String, TreeNode> map = node.children.get(); 
    Map<String, ChildData> result; 
    if (map == null) 
    { 
     result = ImmutableMap.of(); 
    } 
    else 
    { 
     ImmutableMap.Builder<String, ChildData> builder = ImmutableMap.builder(); 
     for (Map.Entry<String, TreeNode> entry : map.entrySet()) 
     { 
      TreeNode childNode = entry.getValue(); 
      ChildData childData = new ChildData(childNode.path, childNode.stat.get(), childNode.data.get()); 
      // Double-check liveness after retreiving data. 
      if (childNode.nodeState.get() == NodeState.LIVE) 
      { 
       builder.put(entry.getKey(), childData); 
      } 
     } 
     result = builder.build(); 
    } 

    // Double-check liveness after retreiving children. 
    return node.nodeState.get() == NodeState.LIVE ? result : null; 
} 

können Sie sehen, dass, wenn die NodeState PENDING oder DEAD oder wird besteht nicht, es null zurück, wenn NodeState LIVE es wird eine Rückkehr Karteninstanz. Wenn der Rückgabewert nicht null ist, ist der Cache bereit.