如何使用java上的zookeeper客户端库递归地创建节点?

h7appiyu  于 2021-06-03  发布在  Hadoop
关注(0)|答案(2)|浏览(451)

我知道对于一个使用python的Zookeeper来说,这个问题已经被问到和回答过了。答案是好的,但是,我想要一些更相关的代码。我已经实现了一个创建节点的方法,但是我想递归地实现它。我的节点的结构如下:
Zookeeper
web服务器
服务器1
服务器2
模块已连接
数据库模块
计算机1
计算机2
服务模块
计算机3
搜索模块
计算机4
我有点像:

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,因此我希望使该方法递归以获得性能和更好的代码,但我不知道如何开始,如果有人能帮助我,我将非常感激。事先非常感谢。

uelo1irk

uelo1irk1#

zookeeper具有有用的属性:
(写入)请求的总顺序
它的异步特性。
你可以用它。只需以正确的顺序将整个树作为一堆异步请求发出,然后等待,直到所有请求都成功执行。当然,您可以忽略'nodeexists'异常(但由于这样的事实,这样的错误将被写入日志,这是不好的)。

guz6ccqo

guz6ccqo2#

我设法取得了更好的成绩:

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

相关问题