【ZkClient】
ZkClient 是 GitHub 上一個開源的客戶端,如果我們用 Maven 來管理工程,則引用如下。
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
創建連接
- public ZkClient(String serverstring)
- public ZkClient(String serverstring,int connectionTimeout)
- public ZkClient(String serverstring,int sessionTimeout,int connectionTimeout)
- public ZkClient(String serverstring,int sessionTimeout,int connectionTimeout,ZkSerializer zkSerializer)
- public ZkClient(IZkConnection connection)
- public ZkClient(IZkConnection connection,int connectionTimeout)
- public ZkClient(IZkConnection connection,int connectionTimeout,ZkSerializer zkSerializer)
package zookeeper.zkclient;
import org.I0Itec.zkclient.ZkClient;
public class OpenZkClient {
public static void main(String[] args) {
ZkClient client = new ZkClient("127.0.0.1:2181",5000);
System.out.println(client.getChildren("/"));
}
}
簡單來說,開源客戶端相對於原 API,主要是將比較繁瑣注冊,刪除節點不能有子節點,新增節點必須有父節點,等等一些容易出錯的地方進行封裝。封裝以后程序員開發的時候就可以不 用考慮這些小的細節,從而提高開發效率。
還是來說說構造器參數的含義:
serverstring 可以指定單個服務器地址也可以是多個,這個和原 API 創建連接構造參數是一樣的含義。
connectionTimeout,sessionTimeout 是連接超時時間和會話超時時間。單位都是毫秒,其中會話默認是 30000 毫秒,也就是 30 秒。
connection 是 IZkConnection 的接口實現類。
zkSerializer 自定義的序列化器,關於序列化和反序列化是一個很大的話題,有 Java 自帶的序列化工具,也有很多開源的序列化工具,以后會寫一章序列化。
創建節點
- 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。而且父節點不存在可以指定是否創建。
刪除節點
- boolean delete(final String path)
- delete(final String path,final AsyncCallback.VoidCallback callback,final Object context)
- boolean deleteRecursive(String path)
說一下 deleteRecursive,原生 API 刪除節點如果有子節點則必須把子節點都刪掉才可以,這里的函數則不需要,它會自動刪除所有的子節點。
讀取數據
(一)、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。
更新數據
- void writeData(String path,Object data)
- void writeData(final String path,Object data,final int expectedVersion)
檢測節點是否存在
- boolean exists(final String path)
謝謝大家觀看!