基本所有的对于节点数据读写都有同步和异步两个版本的重载方法,而且都可以通过该方法向某个节点上注册一个监视器Watcher,异步版本仅仅是多了一个回调接口和传递一个上下文对象参数,这两个参数作用都是相同的。
1. 获取节点的子节点列表
1. 同步:和getData方法类似,第一个参数path表示目标节点路径,而第二个参数是Watcher或者boolean,当节点的子节点列表发生变化时,zk服务器会向我们推送类型为NodeChildrenChanged的事件。返回的List中包含了所有子节点的路径值
public List<String> getChildren(String path, Watcher watcher)
public List<String> getChildren(String path, boolean watch)
2. 异步:
public void getChildren(String path, Watcher watcher, ChildrenCallback cb, Object ctx)
public void getChildren(String path, boolean watch, ChildrenCallback cb, Object ctx)
2. 查询节点是否存在
1. 同步:返回的Stat对象会包含该节点的所有信息,如果该节点不存在则会返回null
public Stat exists(String path, Watcher watcher)
public Stat exists(String path, boolean watch)
2. 异步:
public void exists(String path, Watcher watcher, StatCallback cb, Object ctx)
public void exists(String path, boolean watch, StatCallback cb, Object ctx)
3. 事务操作
Zookeeper中的事务操作有三个相关方法:这三个方法都可以实现相同的效果
(1)public List<OpResult> multi(Iterable<Op> ops):同步执行
(2)public void multi(Iterable<Op> ops, MultiCallback cb, Object ctx):异步执行
(3)public Transaction transaction():同步执行
但实际上transaction()方法是对multi方法的封装,因为每次返回 this 可以串行操作,最后执行commit(),提交批量事务操作,并返回List<OpResult>结果。以串行操作,最后执行commit(),提交批量事务操作,并返回List<OpResult>结果。
对应multi方法的同步和异步两个重载版本,commit方法也有同步和异步两个方法重载版本。
使用multi方法进行事务操作比较麻烦,代码比较繁琐,所以基本都是采用transaction()方法来创建一个事务对象,开启事务操作。
基本操作就是:zk.transaction().create(...).setData(...)... .commit();