zookeeper客戶端使用原生JavaApi操作節點
阿新 • • 發佈:2019-03-15
開發 vat closed 路徑 就是 list disco override ()
1.引入依賴
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.8</version> </dependency>
2.創建會話
1 package com.karat.cn.zookeeper.javaApi; 2 3 import java.io.IOException;View Code4 import java.util.concurrent.CountDownLatch; 5 6 import org.apache.zookeeper.WatchedEvent; 7 import org.apache.zookeeper.Watcher; 8 import org.apache.zookeeper.ZooKeeper; 9 10 /** 11 * 創建會話(連接zookeeper) 12 * @author 開發 13 * 14 */ 15 public class CreateSessionDemo { 16 17 privatefinal static String CONNECTSTRING="47.107.121.215:2181"; 18 19 private static CountDownLatch countDownLatch=new CountDownLatch(1); 20 21 public static void main(String []args) throws IOException, InterruptedException{ 22 ZooKeeper zooKeeper=new ZooKeeper(CONNECTSTRING, 5000,newWatcher() { 23 @Override 24 public void process(WatchedEvent event) { 25 //如果當前的連接狀態是連接成功的,那麽通過計數器去控制 26 if(event.getState()==Event.KeeperState.SyncConnected){ 27 countDownLatch.countDown(); 28 System.out.println(event.getState()); 29 } 30 } 31 }); 32 countDownLatch.await(); 33 System.out.println(zooKeeper.getState()); 34 } 35 }
3.節點的操作
1 package com.karat.cn.zookeeper.javaApi; 2 3 import java.io.IOException; 4 import java.util.List; 5 import java.util.concurrent.CountDownLatch; 6 import java.util.concurrent.TimeUnit; 7 8 import org.apache.zookeeper.CreateMode; 9 import org.apache.zookeeper.KeeperException; 10 import org.apache.zookeeper.WatchedEvent; 11 import org.apache.zookeeper.Watcher; 12 import org.apache.zookeeper.ZooDefs; 13 import org.apache.zookeeper.ZooKeeper; 14 import org.apache.zookeeper.data.Stat; 15 16 /** 17 * java的api對節點的操作 18 * @author 開發 19 * 20 */ 21 public class CreateDodeDemo implements Watcher{ 22 23 private final static String CONNECTSTRING="47.107.121.215:2181"; 24 25 private static CountDownLatch countDownLatch=new CountDownLatch(1); 26 27 private static ZooKeeper zooKeeper; 28 29 private static Stat stat=new Stat(); 30 31 public static void main(String []args) throws IOException, InterruptedException, KeeperException{ 32 /*zooKeeper=new ZooKeeper(CONNECTSTRING, 5000,new Watcher() { 33 @Override 34 public void process(WatchedEvent event) { 35 //如果當前的連接狀態是連接成功的,那麽通過計數器去控制 36 if(event.getState()==Event.KeeperState.SyncConnected){ 37 if(Event.EventType.None==event.getType()&&null==event.getPath()){ 38 countDownLatch.countDown(); 39 System.out.println(event.getState()+"->"+event.getType()); 40 }else if(event.getType()== Event.EventType.NodeDataChanged){//數據變更觸發路徑 41 try { 42 System.out.println("數據變更觸發路徑:"+event.getPath()+"->改變後的值:"+ 43 zooKeeper.getData(event.getPath(),true,stat)); 44 } catch (KeeperException e) { 45 e.printStackTrace(); 46 } catch (InterruptedException e) { 47 e.printStackTrace(); 48 } 49 }else if(event.getType()== Event.EventType.NodeChildrenChanged){//子節點的數據變化會觸發 50 try { 51 System.out.println("子節點數據變更路徑:"+event.getPath()+"->節點的值:"+ 52 zooKeeper.getData(event.getPath(),true,stat)); 53 } catch (KeeperException e) { 54 e.printStackTrace(); 55 } catch (InterruptedException e) { 56 e.printStackTrace(); 57 } 58 }else if(event.getType()== Event.EventType.NodeCreated){//創建子節點的時候會觸發 59 try { 60 System.out.println("節點創建路徑:"+event.getPath()+"->節點的值:"+ 61 zooKeeper.getData(event.getPath(),true,stat)); 62 } catch (KeeperException e) { 63 e.printStackTrace(); 64 } catch (InterruptedException e) { 65 e.printStackTrace(); 66 } 67 }else if(event.getType()== Event.EventType.NodeDeleted){//子節點刪除會觸發 68 System.out.println("節點刪除路徑:"+event.getPath()); 69 } 70 System.out.println(event.getType()); 71 } 72 } 73 });*/ 74 zooKeeper=new ZooKeeper(CONNECTSTRING, 5000,new CreateDodeDemo());//上面代碼改成這一行代碼 75 76 77 countDownLatch.await(); 78 System.out.println(zooKeeper.getState()); 79 80 //連接成功創建節點 81 String result=zooKeeper.create("/app","app節點創建".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); 82 //註冊 83 zooKeeper.getData("/app", true, stat); 84 System.out.println("創建成功->"+result); 85 //修改數據 86 zooKeeper.setData("/app", "修改第一次".getBytes(),-1); 87 //睡眠2秒 88 Thread.sleep(2000); 89 //修改數據 90 zooKeeper.setData("/app", "修改第二次".getBytes(),-1); 91 //睡眠2秒 92 Thread.sleep(2000); 93 //刪除 94 //zooKeeper.delete("/app", -1); 95 //睡眠2秒 96 //Thread.sleep(2000); 97 //創建節點和子節點(臨時節點下不能掛子節點) 98 String path="/node"; 99 100 zooKeeper.create(path, "節點node".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); 101 TimeUnit.SECONDS.sleep(1); 102 103 Stat stat=zooKeeper.exists(path+"/app",true); 104 if(stat==null){//表示節點不存在 105 zooKeeper.create(path+"/app","node子節點".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT); 106 TimeUnit.SECONDS.sleep(1); 107 } 108 //修改子路徑 109 zooKeeper.setData(path+"/app","修改後的".getBytes(),-1); 110 TimeUnit.SECONDS.sleep(1); 111 112 //獲取指定節點下的子節點 113 List<String> list=zooKeeper.getChildren("/node", true);//第二個參數表示獲取是否監控 114 System.out.println(list); 115 116 117 } 118 119 120 /** 121 * 實現接口Watcher中的process抽象方法 122 */ 123 public void process(WatchedEvent watchedEvent) { 124 //如果當前的連接狀態是連接成功的,那麽通過計數器去控制 125 if(watchedEvent.getState()==Event.KeeperState.SyncConnected){ 126 if(Event.EventType.None==watchedEvent.getType()&&null==watchedEvent.getPath()){ 127 countDownLatch.countDown(); 128 System.out.println(watchedEvent.getState()+"-->"+watchedEvent.getType()); 129 }else if(watchedEvent.getType()== Event.EventType.NodeDataChanged){ 130 try { 131 System.out.println("數據變更觸發路徑:"+watchedEvent.getPath()+"->改變後的值:"+ 132 zooKeeper.getData(watchedEvent.getPath(),true,stat)); 133 } catch (KeeperException e) { 134 e.printStackTrace(); 135 } catch (InterruptedException e) { 136 e.printStackTrace(); 137 } 138 }else if(watchedEvent.getType()== Event.EventType.NodeChildrenChanged){//子節點的數據變化會觸發 139 try { 140 System.out.println("子節點數據變更路徑:"+watchedEvent.getPath()+"->節點的值:"+ 141 zooKeeper.getData(watchedEvent.getPath(),true,stat)); 142 } catch (KeeperException e) { 143 e.printStackTrace(); 144 } catch (InterruptedException e) { 145 e.printStackTrace(); 146 } 147 }else if(watchedEvent.getType()== Event.EventType.NodeCreated){//創建子節點的時候會觸發 148 try { 149 System.out.println("節點創建路徑:"+watchedEvent.getPath()+"->節點的值:"+ 150 zooKeeper.getData(watchedEvent.getPath(),true,stat)); 151 } catch (KeeperException e) { 152 e.printStackTrace(); 153 } catch (InterruptedException e) { 154 e.printStackTrace(); 155 } 156 }else if(watchedEvent.getType()== Event.EventType.NodeDeleted){//子節點刪除會觸發 157 System.out.println("節點刪除路徑:"+watchedEvent.getPath()); 158 } 159 System.out.println(watchedEvent.getType()); 160 } 161 162 } 163 }View Code
4.權限控制模式
schema:授權對象
ip : 192.168.1.1
Digest : username:password
world : 開放式的權限控制模式,數據節點的訪問權限對所有用戶開放。 world:anyone
super :超級用戶,可以對zookeeper上的數據節點進行操作
5.連接狀態
KeeperStat.Expired 在一定時間內客戶端沒有收到服務器的通知, 則認為當前的會話已經過期了。
KeeperStat.Disconnected 斷開連接的狀態
KeeperStat.SyncConnected 客戶端和服務器端在某一個節點上建立連接,並且完成一次version、zxid同步
KeeperStat.authFailed 授權失敗
6.事件類型
NodeCreated 當節點被創建的時候,觸發
NodeChildrenChanged 表示子節點被創建、被刪除、子節點數據發生變化
NodeDataChanged 節點數據發生變化
NodeDeleted 節點被刪除
None 客戶端和服務器端連接狀態發生變化的時候,事件類型就是None
zookeeper客戶端使用原生JavaApi操作節點