非“幂等”操作:创建节点
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);
}
}
}