org.apache.zookeeper.Zookeeper
Zookeeper 是在 Java 中客戶端主類,負責建立與 zookeeper 集羣的會話,並提供方法進行操作。
org.apache.zookeeper.Watcher
Watcher 接口表示一個標準的事件處理器,其定義了事件通知相關的邏輯,包含 KeeperState 和 EventType 兩個枚舉類,分別代表了通知狀態和事件類型,同時定義了事件的回調方法:process(WatchedEvent event)。
process 方法是 Watcher 接口中的一個回調方法,當 ZooKeeper 向客戶端發送一個 Watcher 事件通知時,客戶端就會對相應的 process 方法進行回調,從而實現對事件的處理。
基本使用
maven的pom依賴
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.9</version> </dependency>
java代碼
1 public class ZKClient { 2 3 static ZooKeeper zk = null; 4 5 public static void main(String[] args) throws Exception { 6 7 //第一個參數:zk集羣地址 host:port,多個地址之間用英文逗號分隔 8 //第二個參數:連接會話超時時間 單位爲毫秒 9 //第三個參數:匿名new接口 監聽 10 zk = new ZooKeeper("node-1:2181,node-2:2181,node-3:2181", 30000, new Watcher() { 11 //該方法爲監聽觸發是回調的方法 12 public void process(WatchedEvent event) { 13 int i = 0; 14 System.out.println(++i); 15 System.out.println(event.getPath()); 16 System.out.println(event.getType()); 17 System.out.println(event.getState()); 18 //實現永久監聽 19 try { 20 zk.getData("/itcastbyjava2", true, null); 21 } catch (KeeperException e) { 22 e.printStackTrace(); 23 } catch (InterruptedException e) { 24 e.printStackTrace(); 25 } 26 } 27 }); 28 // zk.create("/itcastbyjava2","123321".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); 29 30 //設置監聽 31 zk.getData("/itcastbyjava2", true, null); 32 33 zk.setData("/itcastbyjava2", "456".getBytes(), -1); 34 zk.setData("/itcastbyjava2", "789".getBytes(), -1); 35 36 zk.close(); 37 } 38 }
其他操作
1 public static void main(String[] args) throws Exception { 2 // 初始化 ZooKeeper 實例(zk 地址、會話超時時間,與系統默認一致、watcher) 3 ZooKeeper zk = new ZooKeeper("node-1:2181,node-2:2181,node-3:2181", 30000, new Watcher() { 4 @Override 5 public void process(WatchedEvent event) { 6 System.out.println("事件類型爲:" + event.getType()); 7 System.out.println("事件發生的路徑:" + event.getPath()); 8 System.out.println("通知狀態爲:" +event.getState()); 9 } 10 }); 11 // 創建一個目錄節點 12 zk.create("/testRootPath", "testRootData".getBytes(), Ids.OPEN_ACL_UNSAFE, 13 CreateMode.PERSISTENT); 14 // 創建一個子目錄節點 15 zk.create("/testRootPath/testChildPathOne", "testChildDataOne".getBytes(), 16 Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); 17 System.out.println(new String(zk.getData("/testRootPath",false,null))); 18 // 取出子目錄節點列表 19 System.out.println(zk.getChildren("/testRootPath",true)); 20 // 修改子目錄節點數據 21 zk.setData("/testRootPath/testChildPathOne","modifyChildDataOne".getBytes(),-1); 22 System.out.println("目錄節點狀態:["+zk.exists("/testRootPath",true)+"]"); 23 // 創建另外一個子目錄節點 24 zk.create("/testRootPath/testChildPathTwo", "testChildDataTwo".getBytes(), 25 Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); 26 System.out.println(new String(zk.getData("/testRootPath/testChildPathTwo",true,null))); 27 // 刪除子目錄節點 28 zk.delete("/testRootPath/testChildPathTwo",-1); 29 zk.delete("/testRootPath/testChildPathOne",-1); 30 // 刪除父目錄節點 31 zk.delete("/testRootPath",-1); 32 zk.close(); 33 }