public Stat exists(final String path, Watcher watcher)
throws KeeperException, InterruptedException
{
final String clientPath = path;
PathUtils.validatePath(clientPath);
// the watch contains the un-chroot path
WatchRegistration wcb = null;
if (watcher != null) {
wcb = new ExistsWatchRegistration(watcher, clientPath);
}
final String serverPath = prependChroot(clientPath);
RequestHeader h = new RequestHeader();
h.setType(ZooDefs.OpCode.exists);
ExistsRequest request = new ExistsRequest();
request.setPath(serverPath);
request.setWatch(watcher != null);
SetDataResponse response = new SetDataResponse();
ReplyHeader r = cnxn.submitRequest(h, request, response, wcb);
if (r.getErr() != 0) {
if (r.getErr() == KeeperException.Code.NONODE.intValue()) {
return null;
}
throw KeeperException.create(KeeperException.Code.get(r.getErr()),
clientPath);
}
return response.getStat().getCzxid() == -1 ? null : response.getStat();
}
Return the stat of the node of the given path. Return null if no such a
node exists.
If the watch is non-null and the call is successful (no exception is thrown),
a watch will be left on the node with the given path. The watch will be
triggered by a successful operation that creates/delete the node or sets
the data on the node.
这个方法通常用来增加监听
在原生客户端里,监听是一次性的,在 增删改 出发监听后,监听就没有了。
而且如果是调用以下这个方法:
public Stat exists(String path, boolean watch) throws KeeperException,
InterruptedException
{
return exists(path, watch ? watchManager.defaultWatcher : null);
}
只有父节点有监听才行,而且不能隔代。