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失效時能夠自動重新訂閱這些事件,而不需要開發者重新訂閱。