Java 使用curator treeCache时,如何确保缓存已准备就绪?

Java 使用curator treeCache时,如何确保缓存已准备就绪?,java,apache-zookeeper,apache-curator,Java,Apache Zookeeper,Apache Curator,使用curatortreeCache时,如何确保缓存已准备就绪 在cache.start()之后,如果我立即调用getCurrentData,它将返回null,那么我如何确保缓存已就绪?有人能给我举个例子吗?谢谢 client = CuratorFrameworkFactory.builder() .connectString(connectionString) .retryPolicy(new ExponentialBackoffRetry(

使用curator
treeCache
时,如何确保缓存已准备就绪

cache.start()
之后,如果我立即调用
getCurrentData
,它将返回
null
,那么我如何确保缓存已就绪?有人能给我举个例子吗?谢谢

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

从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;
}
公共映射getCurrentChildren(字符串完整路径) { TreeNode节点=查找(完整路径); if(node==null | | node.nodeState.get()!=nodeState.LIVE) { 返回null; } ConcurrentMap=node.children.get(); 地图结果; if(map==null) { 结果=ImmutableMap.of(); } 其他的 { ImmutableMap.Builder=ImmutableMap.Builder(); for(Map.Entry:Map.entrySet()) { TreeNode childNode=entry.getValue(); ChildData ChildData=新的ChildData(childNode.path,childNode.stat.get(),childNode.data.get()); //在检索数据后再次检查活动性。 if(childNode.nodeState.get()==nodeState.LIVE) { builder.put(entry.getKey(),childData); } } 结果=builder.build(); } //在收回孩子后再次检查活跃度。 return node.nodeState.get()==nodeState.LIVE?结果:null; }
您可以看到,当NodeState处于挂起状态或死亡状态或不存在时,它将返回null,当NodeState处于活动状态时,它将返回Map实例。因此,当返回值不为null时,缓存已准备就绪。

您可以为Treecache添加一个侦听器,并侦听初始化的事件

    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);

有人找到比这更好的解决方案吗?