文章目录
exists()作用
客户端可以通过ZooKeeper的API来检测节点是否存在,有如下4个接口:
public Stat exists(final String path, Watcher watcher)
public Stat exists(String path, boolean watch)
public void exists(final String path, Watcher watcher, StatCallback cb, Object ctx)
public void exists(String path, boolean watch, StatCallback cb, Object ctx)
这里列出的4个API分别是用同步(前2个)和异步方式(后两个)来检测节点是否存在的接口,API方法的参数说明如下表所示:
参数名 | 说明 |
---|---|
path | 指定数据节的节点路径,即API调用的目的是检测该节点是否存在 |
watcher | 注册的Watcher,用于监听以下三类事件: 节点被创建 、节点被删除、 节点被更新 |
watch | 指定是否复用ZooKeeper中默认的Watcher |
cb | 注册一个异步回调函数 |
ctx | 用于传递上下文信息的对象 |
举例
同步方法的返回值为Stat,如果节点为空,则返回null,据此,我们可以判断某个节点是否为空
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
public class ZookeeperExistsTest {
public static void main(String[] args) throws KeeperException, InterruptedException, IOException {
ZooKeeper zk = new ZooKeeper("10.57.66.192:2181", 5000, new Watcher() {
@Override
public void process(WatchedEvent event) {
}
});
Stat stat = zk.exists("/zk-node",false);
if(stat == null){
System.out.println("节点为空");
//节点不存在,可以去创建
//zk.create();
}else{
System.out.println("节点不为空");
//节点已存在,查询节点的数据
//zk.getData();
}
}
}
如果此时不存在该节点执行结果:
节点为空