1. 程式人生 > >zookeeper客戶端使用原生JavaApi操作節點

zookeeper客戶端使用原生JavaApi操作節點

開發 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;
4 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 private
final 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,new
Watcher() { 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 }
View Code

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操作節點