<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      使用Java操作Zookeeper

      目錄

      一、介紹

      二、zookeeper API

        2.1、導入依賴

        2.2、連接zk集群

        2.3、操作數據操作

      三、zkClient API

        3.1、導入依賴

        3.2、使用示例

       

       

       

       

      一、介紹

        這里主要記錄通過Java調用API來操作Zookeeper集群的數據,對于zookeeper集群的搭建或者命令,可以參考:

        目前接觸到的Java操作Zookeeper,有兩套API,一套是zookeeper官方提供的(zookeeper),另外一套是封裝了官方API的API(zkClient),從描述上來看,就知道,官方的API可能不是那么好用,不然也不會在封裝。  

       

      二、zookeeper API

      2.1、導入依賴

        使用zookeeper官方api的時候,請保證jar包的版本,和zk集群中zk的版本相同

      <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
      <dependency>
          <groupId>org.apache.zookeeper</groupId>
          <artifactId>zookeeper</artifactId>
          <version>3.4.7</version>
      </dependency>
      

        

      2.2、連接zk集群

        下面是代碼示例,兩種形式(分別使用匿名類和Lambda表達式):

      package cn.ganlixin.zk;
      
      import org.apache.zookeeper.KeeperException;
      import org.apache.zookeeper.WatchedEvent;
      import org.apache.zookeeper.Watcher;
      import org.apache.zookeeper.ZooKeeper;
      import org.junit.Test;
      
      import java.io.IOException;
      
      public class ZookeeperDemo {
      
          @Test
          public void connectZkCluster() throws IOException, KeeperException, InterruptedException {
      
              // 構造方法
              // ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
              
              // 匿名對象形式
              ZooKeeper zooKeeper = new ZooKeeper(
                      "192.168.1.3:2181,192.168.1.4:2181,192.168.1.5:2181",
                      20000,
                      new Watcher() {
                          @Override
                          public void process(WatchedEvent watchedEvent) {
                              // 發生變更的節點路徑
                              String path = watchedEvent.getPath();
                              System.out.println("path:" + path);
      
                              // 通知狀態
                              Watcher.Event.KeeperState state = watchedEvent.getState();
                              System.out.println("KeeperState:" + state);
      
                              // 事件類型
                              Watcher.Event.EventType type = watchedEvent.getType();
                              System.out.println("EventType:" + type);
                          }
                      }
              );
      
              // 關閉連接
              zooKeeper.close();
      
              // Lamdba形式
              ZooKeeper zk = new ZooKeeper(
                      "192.168.1.3:2181,192.168.1.4:2181,192.168.1.5:2181",
                      20000,
                      watchedEvent -> {
                          // 發生變更的節點路徑
                          String path = watchedEvent.getPath();
                          System.out.println("path:" + path);
      
                          // 通知狀態
                          Watcher.Event.KeeperState state = watchedEvent.getState();
                          System.out.println("KeeperState:" + state);
      
                          // 事件類型
                          Watcher.Event.EventType type = watchedEvent.getType();
                          System.out.println("EventType:" + type);
                      }
              );
      
              zk.close();
          }
      }
      

        

        運行上面的代碼,控制臺輸出如下(輸出了兩遍,是因為創建了兩次連接)

      path:null
      KeeperState:SyncConnected
      EventType:None
      path:null
      KeeperState:SyncConnected
      EventType:None
      

        

      2.3、操作數據操作

        操作Zk中的數據,方式也很簡單,只需要使用創建的zk連接,調用對應的方法即可(方法名與zk命令行中命令相同)

      package cn.ganlixin.zk;
      
      import org.apache.zookeeper.CreateMode;
      import org.apache.zookeeper.KeeperException;
      import org.apache.zookeeper.ZooDefs;
      import org.apache.zookeeper.ZooKeeper;
      import org.apache.zookeeper.data.Stat;
      import org.junit.Test;
      
      import java.io.IOException;
      
      public class ZookeeperDemo {
      
          @Test
          public void manageData() throws KeeperException, InterruptedException, IOException {
      
              // 創建zk連接
              ZooKeeper zk = new ZooKeeper(
                      "192.168.1.3:2181,192.168.1.4:2181,192.168.1.5:2181",
                      20000,
                      null
              );
      
              // 創建節點
              zk.create("/abc", "123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
      
              // 獲取節點數據
              // getData(String path, boolean watch, Stat stat);
              Stat stat = new Stat();
              byte[] data = zk.getData("/abc", false, stat);
              System.out.println(new String(data));       // 數據內容 123
              System.out.println(stat.getDataLength());   // 節點狀態(數據長度) 3
      
              // 對/abc進行watch
              zk.getData("/abc",
                      watchedEvent -> {
                          System.out.println("path:" + watchedEvent.getPath());
                          System.out.println("KeeperState:" + watchedEvent.getState());
                          System.out.println("EventType:" + watchedEvent.getType());
                      },
                      null);
      
              // 設置節點數據
              // setData(String path, byte[] data, int version)
              // 指定version為-1,表示不關心版本
              zk.setData("/abc", "456".getBytes(), -1);
      
              // 設置兩次,第二次不會觸發通知
              zk.setData("/abc", "789".getBytes(), -1);
      
              // 阻塞,以等待通知
              Thread.sleep(1000);
              zk.close();
          }
      }

        上面的程序,運行輸出結果如下:

      123
      3
      path:/abc
      KeeperState:SyncConnected
      EventType:NodeDataChanged  

        可以看到,只顯示了一次通知,和與預期相符。

       

      三、zkClient API

        因為Zookeeper API比較復雜,使用并不方便,所以出現了ZkClient,ZkClient對Zookeeper API進行了封裝,利用ZkClient可以更加方便地對Zookeeper進行操作。

      3.1、導入依賴

        因為zkClient是對zookeeper的再封裝,所以需要注意zkClient中zookeeper的版本與zk集群的版本相同,可以在maven倉庫中查看對應關系

      <!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
      <dependency>
          <groupId>com.101tec</groupId>
          <artifactId>zkclient</artifactId>
          <version>0.10</version>
      </dependency>
      

        

      3.2、使用示例

        下面是個簡單的示例:

      package cn.ganlixin.zk;
      
      import org.I0Itec.zkclient.IZkChildListener;
      import org.I0Itec.zkclient.IZkStateListener;
      import org.I0Itec.zkclient.ZkClient;
      import org.apache.zookeeper.CreateMode;
      import org.apache.zookeeper.Watcher;
      import org.junit.Test;
      
      import java.util.List;
      
      public class ZkClientDemo {
      
          @Test
          public void testConn() throws InterruptedException {
              ZkClient zkClient = new ZkClient(
                      "192.168.1.3:2181,192.168.1.4:2181,192.168.1.5:2181",
                      20000
              );
      
              // 創建節點
              zkClient.createPersistent("/abc", "hello");
              zkClient.createEphemeral("/xyz", "world");
              zkClient.create("/opq", "world", CreateMode.EPHEMERAL_SEQUENTIAL);
      
              String data = zkClient.readData("/abc");
              System.out.println(data);
      
              // 監聽狀態變化
              zkClient.subscribeStateChanges(new IZkStateListener() {
                  @Override
                  public void handleStateChanged(Watcher.Event.KeeperState keeperState) throws Exception {
                      System.out.println("state:" + keeperState);
                  }
      
                  @Override
                  public void handleNewSession() throws Exception {
                      System.out.println("new session");
                  }
      
                  @Override
                  public void handleSessionEstablishmentError(Throwable throwable) throws Exception {
                      throwable.printStackTrace();
                  }
              });
      
              // 監聽子節點發生變化
              zkClient.subscribeChildChanges("/", new IZkChildListener() {
                  @Override
                  public void handleChildChange(String path, List<String> list) throws Exception {
                      System.out.println("watch path:" + path);
                      // 輸出所有子節點
                      list.forEach(str -> {
                          System.out.println(str);
                      });
                  }
              });
      
              Thread.sleep(100000);
          }
      }
      

        

        

       

       

      posted @ 2019-06-09 16:33  尋覓beyond  閱讀(8165)  評論(0)    收藏  舉報
      返回頂部
      主站蜘蛛池模板: 青青草原国产精品啪啪视频| 国产精品青草久久久久福利99 | 国产亚洲精品一区二区无| 国产精品女生自拍第一区| 国产精品伦人视频免费看| 在线 欧美 中文 亚洲 精品| 国产精品小视频一区二页| 亚洲国产精品高清久久久| 沙坪坝区| 长春市| AV最新高清无码专区| 成人无码视频在线观看免费播放| 东辽县| 成人亚洲欧美一区二区三区| 一区二区三区av在线观看 | 成人3d动漫一区二区三区| 欧美精品一区二区三区中文字幕| 欧美成人免费全部| 91精品国产蜜臀在线观看| 精品亚洲国产成人av| 中文字幕精品人妻丝袜| 国产欧美日韩精品第二区| 色综合天天综合网天天看片| 久久亚洲中文无码咪咪爱| 少妇人妻无码专区在线视频| 国产又色又爽又黄的网站免费| 黑人好猛厉害爽受不了好大撑 | 精品人妻大屁股白浆无码| 免费人妻av无码专区| 亚洲精品无码成人A片九色播放| 色噜噜亚洲男人的天堂| 人妻聚色窝窝人体WWW一区| 正在播放的国产A一片| 最新国产精品中文字幕| 中文字幕乱妇无码AV在线| 国内精品国产三级国产a久久| 日韩有码中文字幕av| 黑巨人与欧美精品一区| 与子乱对白在线播放单亲国产| 国产免费一区二区不卡| 国产精品女同性一区二区|