zookeeper分布式锁(六)


非“幂等”操作:创建节点

zookeeper分布式锁(五)我们讲解了“幂等”和“非幂等”操作。

本节,我们将通过创建节点这个非“幂等”操作来创建对应方法。

我们通过在节点名称中添加UUID来标示唯一节点,这里我们用zookeeper的sessionid代替。

我们定义方法findPrefixInChildren()。

findPrefixInChildren()方法的访问权限是“private”,返回类型是“void”,参数有:

prefix,节点名称的前缀

zookeeper

dir,lock应用的根节点路径

代码如下:

<span style="white-space:pre">	</span>//假如出现“网络丢失”的异常
    	//此时不能判断节点是否创建成功
    	//且节点的创建“非幂等”
    	//因此需要遍历所有的节点根据名称去判断节点是否已经存在
    	//如果存在,返回
    	//如果不存在,创建
    	//根据代码实现可以发现:
    	//判断节点是否存在是根据prefix参数进行判断的
    	//也就是说根据“"x-" + sessionId + "-"”进行是否存在的判断
        private void findPrefixInChildren(String prefix, ZooKeeper zookeeper, String dir) 
            throws KeeperException, InterruptedException {
            List<String> names = zookeeper.getChildren(dir, false);
            for (String name : names) {
                if (name.startsWith(prefix)) {
                    id = name;
                    if (LOG.isDebugEnabled()) {
                        LOG.debug("Found id created last time: " + id);
                    }
                    break;
                }
            }
            if (id == null) {
                id = zookeeper.create(dir + "/" + prefix, data, 
                        getAcl(), EPHEMERAL_SEQUENTIAL);

                if (LOG.isDebugEnabled()) {
                    LOG.debug("Created id: " + id);
                }
            }

        }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值