org.apache.zookeeper.Zookeeper
Zookeeper 是在 Java 中客戶端主類,負(fù)責(zé)建立與 zookeeper 集群的會(huì)話, 并提供方法進(jìn)行操作。
org.apache.zookeeper.Watcher
Watcher 接口表示一個(gè)標(biāo)準(zhǔn)的事件處理器,其定義了事件通知相關(guān)的邏輯, 包含 KeeperState 和 EventType 兩個(gè)枚舉類,分別代表了通知狀態(tài)和事件類型, 同時(shí)定義了事件的回調(diào)方法:process(WatchedEvent event)。
process 方法是 Watcher 接口中的一個(gè)回調(diào)方法,當(dāng) ZooKeeper 向客戶端發(fā)送一個(gè) Watcher 事件通知時(shí),客戶端就會(huì)對(duì)相應(yīng)的 process 方法進(jìn)行回調(diào),從而實(shí)現(xiàn)對(duì)事件的處理。
5.1 . 基本使用
建立 java maven 項(xiàng)目,引入 maven pom 坐標(biāo)。
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.9</version>
</dependency>
5.2 . 更多操作示例
public static void main(String[] args) throws Exception {
// 初始化 ZooKeeper 實(shí)例(zk 地址、會(huì)話超時(shí)時(shí)間,與系統(tǒng)默認(rèn)一致、watcher)
ZooKeeper zk = new ZooKeeper("node-21:2181,node-22:2181", 30000, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("事件類型為:" + event.getType());
System.out.println("事件發(fā)生的路徑:" + event.getPath());
System.out.println("通知狀態(tài)為:" +event.getState());
}
});
// 創(chuàng)建一個(gè)目錄節(jié)點(diǎn)
zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
// 創(chuàng)建一個(gè)子目錄節(jié)點(diǎn)
zk.create("/testRootPath/testChildPathOne", "testChildDataOne".getBytes(),
Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
System.out.println(new String(zk.getData("/testRootPath",false,null)));
// 取出子目錄節(jié)點(diǎn)列表
System.out.println(zk.getChildren("/testRootPath",true));
// 修改子目錄節(jié)點(diǎn)數(shù)據(jù)
zk.setData("/testRootPath/testChildPathOne","modifyChildDataOne".getBytes(),-1);
System.out.println("目錄節(jié)點(diǎn)狀態(tài):["+zk.exists("/testRootPath",true)+"]");
// 創(chuàng)建另外一個(gè)子目錄節(jié)點(diǎn)
zk.create("/testRootPath/testChildPathTwo", "testChildDataTwo".getBytes(),
Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
System.out.println(new String(zk.getData("/testRootPath/testChildPathTwo",true,null)));
// 刪除子目錄節(jié)點(diǎn)
zk.delete("/testRootPath/testChildPathTwo",-1);
zk.delete("/testRootPath/testChildPathOne",-1);
// 刪除父目錄節(jié)點(diǎn)
zk.delete("/testRootPath",-1);
zk.close();