public Stat
exists(final String path
, Watcher watcher
)
throws KeeperException
, InterruptedException
{
final String clientPath
= path
;
PathUtils
.validatePath(clientPath
);
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
);
}
只有父节点有监听才行,而且不能隔代。