使用原生的Zookeeper API来与Zookeeper服务端进行交互还是比较繁琐复杂的,为了简化这些操作,就诞生了一些封装客户端。这些客户端除了简单易用,还增加了Session重连等一些特殊功能,比较知名的有ZkClient和Curator。
我们主要讲述ZkClient的使用,关于Curator的使用读者可以自行去了解。
ZkClient在原生的Zookeeper API接口上进行了包装,更加简单易用。ZkClient内部还实现了Session超时重连、Watcher反复注册等功能,使得这些操作对开发透明,提高了开发的效率。
public ZkClient(String serverstring)
public ZkClient(String zkServers, int connectionTimeout)
public ZkClient(String zkServers, int sessionTimeout, int connectionTimeout)
public ZkClient(String zkServers, int sessionTimeout, int connectionTimeout, ZkSerializer zkSerializer)
public ZkClient(IZkConnection connection)
public ZkClient(IZkConnection connection, int connectionTimeout)
public ZkClient(IZkConnection zkConnection, int connectionTimeout, ZkSerializer zkSerializer)
public String create(final String path, Object data, final CreateMode mode) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException
public void createEphemeral(final String path) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException
public void createEphemeral(final String path, final Object data) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException
public String createEphemeralSequential(final String path, final Object data) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException
public void createPersistent(String path) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException
public void createPersistent(String path, boolean createParents) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException
public void createPersistent(String path, Object data) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException
public String createPersistentSequential(String path, Object data) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException
上面第一种创建方式基本和原生的Zookeeper API格式一致,而下面几种创建方式均将节点的类型隐藏在了方法名上,通过方法名就可以看出创建的节点的类型。
public boolean delete(final String path)
public boolean deleteRecursive(String path)
delete方法与deleteRecursive方法的区别是deleteRecursive方法可以在节点有子节点的情况下进行删除。
public List<String> getChildren(String path)
// 不再同一个包下无法调用
protected List<String> getChildren(final String path, final boolean watch)
public List<String> subscribeChildChanges(String path, IZkChildListener listener)
前两个方法是获取节点的子节点列表,最后一个方法相当于注册了一个Watcher,该方法与注册Watcher的区别是在注册的时候,节点可以不存在也可以监听 而且一次注册永久有效。IZkChildListener主要在以下事件发生时通知客户端:
public interface IZkChildListener {
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception;
}
public void writeData(String path, Object data)
public void writeData(final String path, Object data, final int expectedVersion)
public <T extends Object> T readData(String path)
public <T extends Object> T readData(String path, boolean returnNullIfPathNotExists)
public <T extends Object> T readData(String path, Stat stat)
// 不再同一个包下无法调用
protected <T extends Object> T readData(final String path, final Stat stat, final boolean watch)
public void subscribeDataChanges(String path, IZkDataListener listener)
最后一个方法相当于注册一个Watcher,IZkDataListener主要在以下事件发生时通知客户端:
public interface IZkDataListener {
public void handleDataChange(String dataPath, Object data) throws Exception;
public void handleDataDeleted(String dataPath) throws Exception;
}
下面这个方法就不解释了,就是检测一个节点存不存在
public boolean exists(final String path)
注册一个Watcher,用来监听当前客户端会话的状态变化,如果客户端会话状态发生变化,将会回调IZkStateListener中的方法
public void subscribeStateChanges(final IZkStateListener listener)
public interface IZkStateListener {
// 会话状态发生变化时回调
public void handleStateChanged(KeeperState state) throws Exception;
// 当一个会话过期重新新家会话的时候回调
public void handleNewSession() throws Exception;
}