2013-04-17 21 views
0

我知道这个问题已经被问及使用Python的zookeeper的回答。答案很好,但是,我想要一些与代码更相关的东西。我已经实现了创建节点的方法,但是我想递归地执行它。我的节点结构将是这样的:如何在Java上使用zookeeper客户端库递归创建节点?

ZOOKEEPER

  • WEB SERVER
    • SERVER1
    • SERVER2
  • 模块相连
    • 数据库模块
      • COMPUTER1
      • 电脑2
    • 服务模块
      • COMPUTER3
    • 搜索模块
      • COMPUTER4

我有类似:

Zookeeper zk = new Zookeeper(...); 

public void createNodeRecursively(String type) { 
    final String node = "/" + type + "/" + info.getIP() + ":" + info.getPort(); // Correct line 
    if (zk.exists("/" + type, null) == null) { 
     Object ctx = new Object(); 
     StringCallback cb = new StringCallback() { 
      public void processResult(int rc, String path, 
           Object ctx, String name) { 
       if (name.equals("/" + type))// just in case 
        try { 
         zk.create(node, info.getBytes(), 
          Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
      } 
     }; 
     zk.create("/" + type, info.getBytes(), Ids.OPEN_ACL_UNSAFE, 
          CreateMode.PERSISTENT, cb, ctx); 

    } else 
     zk.create(node, info.getBytes(), Ids.OPEN_ACL_UNSAFE, 
          CreateMode.EPHEMERAL); 
    } 
} 

正如你可以看到我使用zk.create很多次,所以我想使该方法递归以获得业绩,并具有更好的代码,但我不知道如何开始,如果有人能帮助我,我将非常感激。非常感谢你提前。

回答

0

我设法达成了更好的性能:

public void createNode(NodePath nodePath, NodeData nodeData, NodeRights nodeRights, NodeCreationHandler nodeCreationHandler) throws KeeperException, InterruptedException, ZookeeperCreationException { 

     if (zk == null) { 
      throw new ZookeeperCreationException("The zookeeper client has not been instanced."); 
     }  
     String targetPath = nodePath.getFullNodePath(); 
     targetPath = targetPath.substring(1, targetPath.length()); 
     byte[] serializedData = nodeData.serialize(new Object()); 
     String[] array = targetPath.split(ICoordinationConstants.BASE_ROOT_SPTR); 
     String acum=""; 
     for (int i = 0; i < array.length-1; i++) { 
      acum+=(ICoordinationConstants.BASE_ROOT_SPTR+array[i]); 
      if (zk.exists(acum, null) == null) { 
       zk.create(acum, serializedData, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); 
      } 
     } 
     zk.create(acum+ICoordinationConstants.BASE_ROOT_SPTR+array[array.length-1], serializedData, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);    
    } 
0

动物园管理员拥有有用的属性:

  1. (写)的总订单请求
  2. 它的异步特性。

你可以使用它。 只需按正确的顺序将整棵树作为一堆异步请求发送,然后等待,直到所有这些请求成功执行。当然,你可以忽略'NodeExists'异常(但它不好,因为这样的错误会写入日志)。

相关问题