ZkClient
创建一个ZkClient实例
ZkClient zkClient = new ZkClient("127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002");
读取数据
byte[] readData(String path); byte[] readData(String path, boolean returnNullIfPathNotExists); byte[] readData(String path, Stat stat);
写入数据
Stat writeData(String path, byte[] data); Stat writeData(String path, byte[] data, int expectedVersion);
创建节点
void createPersistent(String path); void createPersistent(String path, boolean createParents); void createPersistent(String path, byte[] data); String createPersistentSequential(String path, byte[] data); void createEphemeral(final String path); void createEphemeral(final String path, final byte[] data); String createEphemeralSequential(final String path, final byte[] data); String create(final String path, byte[] data, final CreateMode mode);
删除节点
boolean delete(final String path); boolean deleteRecursive(String path);
查询节点
boolean exists(final String path); List<String> getChildren(String path); long getCreationTime(String path); int countChildren(String path);
订阅事件
zkclient的强大之处不在于基本zookeeper api操作,而在于事件监听机制,也就是zookeeper的watches。
Zookeeper的watcher在使用上存在一次性、session过期等难点,因此zkclient对这些问题进行了封装和屏蔽。 zkclient一共定义了三种事件:
org.I0Itec.zkclient..IZkStateListener
public void handleStateChanged(KeeperState state) throws Exception; public void handleNewSession() throws Exception;
org.I0Itec.zkclient.IZkDataListener
public void handleDataChange(String dataPath, byte[] data) throws Exception; public void handleDataDeleted(String dataPath) throws Exception;
org.I0Itec.zkclient.IZkChildListener
public void handleChildChange(String parentPath, List currentChildren) throws Exception;
- IZkStateListener 定义了两种事件,一种是连接状态的改变,例如由未连接改变成连接上,连接上改为过期等;另一种创建一个新的session(连接), 通常是由于session失效然后新的session被建立时触发。一般此时需要开发者重新创建临时节点(Ephemeral Nodes)。
- IZkDataListener 也定义了两种事件,一种是节点数据的变化,另一种是节点被删除。
- IZkChildListener 定义了一种事件,描述子节点变化了,这时候获取到的是新的子节点列表。如果此节点被删除,那么子节点列表是null(非空列表)。
IZkClient能够非常方便的订阅这三种事件:
void subscribeStateChanges(IZkStateListener listener); void subscribeDataChanges(String path, IZkDataListener listener); List subscribeChildChanges(String path, IZkChildListener listener);
而zkclient最强大之处在于,当发送session失效时能够自动重新订阅这些事件,而不需要开发者重新订阅。