一、简介
上一节提到,在使用ZooKeeper的原生API时,经常需要处理几个问题:重复注册watcher、session失效重连、异常处理(删除节点不能有子节点,新增节点必须有父节点等),这使得实际使用中比较繁琐。zkclient是Github上一个开源的Zookeeper客户端,在Zookeeper原生 API接口之上进行了包装,是一个更加易用的Zookeeper客户端。同时Zkclient在内部实现了诸如Session超时重连,Watcher反复注册等功能,程序员开发的时候就可以不 用考虑这些小的细节,从而提高开发效率。
二、zkClient的基本操作
在使用zkClient操作Zookeeper时,基本的操作都封装在ZkClient类中,使用时直接创建ZkClient对象,调用其相应的方法即可。
1)创建连接
直接在ZkClient的构造函数中指定连接参数,完成对象创建后连接也就已经创建好。在ZkClient中提供了以下几个构造函数:
- public ZkClient(String serverstring)
- public ZkClient(String zkServers, int connectionTimeout)
- public ZkClient(String zkServers, int sessionTimeout, int connectionTimeout)
- ZkClient(String zkServers, int sessionTimeout, int connectionTimeout, ZkSerializer zkSerializer)
- ppublic ZkClient(final String zkServers, final int sessionTimeout, final int connectionTimeout, final ZkSerializer zkSerializer, final long operationRetryTimeout)
- public ZkClient(IZkConnection connection)
- public ZkClient(IZkConnection connection, int connectionTimeout)
- public ZkClient(IZkConnection zkConnection, int connectionTimeout, ZkSerializer zkSerializer)
- public ZkClient(final IZkConnection zkConnection, final int connectionTimeout, final ZkSerializer zkSerializer, final long operationRetryTimeout)
构造器参数的含义如下:
- serverstring 可以指定单个服务器地址也可以是多个,这个和原 API 创建连接构造参数是一样的含义。
- connectionTimeout,sessionTimeout 是连接超时时间和会话超时时间。单位都是毫秒,其中会话默认是 30000 毫秒,也就是 30 秒。
- connection 是 IZkConnection 的接口实现类。
- zkSerializer 自定义的序列化器。
- operationRetryTimeout 是在与服务连接断开后,进行重试操作的最长时间。也就是说,如果断开时间未超过operationRetryTimeout,则所有操作进行重试。operationRetryTimeout单位也是毫秒,如果传入小于0的值,则一直进行操作重试,直至与服务的连接恢复。
2)创建节点
- String create(final String path,Object data,final CreateMode mode)
- String create(final String path,Object data,final List<ACL> acl,final CreateMode mode)
- void create(final String path,Object data,final CreateMode mode,final AsyncCallback.StringCallback callback,final Object data)
- void createEphemeral(final String path)
- void createEphemeral(final String path,final Object data)
- void createPersistent(String path)
- void createPersistent(String path,boolean createParents)
- void createPersistent(String path,Object data)
- void createPersistent(String path,List<ACL> acl,Object data)
- void createPersistentSequential(String path,Object data)
- void createEphemeralSequential(final String path,final Object data)
创建节点和原生 API 相比,原生只能传 byte 数组,这里可以传 Object。而且父节点不存在可以指定是否创建。
3)删除节点
- boolean delete(final String path)
- delete(final String path,final AsyncCallback.VoidCallback callback,final Object context)
- boolean deleteRecursive(String path)
说一下 deleteRecursive,原生 API 删除节点如果有子节点则必须把子节点都删掉才可以,这里的函数则不需要,它会自动删除所有的子节点。
4)读取数据
(一)、getChildren
- List<String> getChildren(String path)
(二)、getData
- <T extends Object> T readData(String path)
- <T extends Object> T readData(String path,boolean returnNullIfPathNotExists)
- <T extends Object> T readData(String path,Stat stat)
这里说一下 returnNullIfPathNotExists,原生 API 读取数据,如果 path 不存在就会报错,这里设置 returnNullIfPathNotExists 为 true 则不会报错,会返回 null。
5)更新数据
- void writeData(String path,Object data)
- void writeData(final String path,Object data,final int expectedVersion)
6)检测节点是否存在
- boolean exists(final String path)
三、zkClient的事件监听机制
在原生Zk API中,提供了watcher的机制监听节点,而zkClient将之转换成Listener的概念,就是订阅服务端的事件,从而我们只要实现IZkChildListener 接口相应的方法就能够对事件进行处理。
订阅/取消订阅节点子变化事件
- public List<String> subscribeChildChanges(String path, IZkChildListener listener)
- public void unsubscribeChildChanges(String path, IZkChildListener childListener)
订阅/取消订阅数据变化事件
- public void subscribeDataChanges(String path, IZkDataListener listener)
- public void unsubscribeDataChanges(String path, IZkDataListener dataListener)
订阅/取消订阅连接状态变化事件
- public void subscribeStateChanges(final IZkStateListener listener)
- public void unsubscribeStateChanges(IZkStateListener stateListener)
取消所有订阅事件
- public void unsubscribeAll()
此外,zkClient还对权限控制等进行了封装,关于Zookeeper的权限控制,我们明天再进行学习。更详细的API可以直接阅读ZkClient类的源码:https://github.com/sgroschupf/zkclient/blob/master/src/main/java/org/I0Itec/zkclient/ZkClient.java
参考:
Zookeeper 客户端 ZkClient https://www.cnblogs.com/xums/p/7220449.html
zookeeper学习之zkclient事件监听 https://my.oschina.net/u/2277632/blog/1532162