zookeeper 客户端源码解读(三)exists

mac2024-04-01  28

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

只有父节点有监听才行,而且不能隔代。

最新回复(0)