zoukankan      html  css  js  c++  java
  • Zookeeper客户端使用(使用原生zookeeper)

    Zookeeper客户端使用

    一、使用原生zookeeper

    在pom.xml中加入依赖

    <dependency>
      <groupId>org.apache.zookeeper</groupId>
      <artifactId>zookeeper</artifactId>
      <version>3.4.13</version>
    </dependency>

    直接上代码:

      1 /**
      2  * Project Name:mk-project <br>
      3  * Package Name:com.suns.zookeeper <br>
      4  *
      5  * @author mk<br>
      6  * Date:2018-10-31 9:09 <br>
      7  */
      8 
      9 package com.suns.zookeeper;
     10 
     11 import org.apache.zookeeper.*;
     12 import org.apache.zookeeper.data.Stat;
     13 
     14 import java.util.List;
     15 import java.util.concurrent.CountDownLatch;
     16 
     17 /**
     18  * 原生的zookeeper客户端
     19  * 1.连接是异步的,使用时需要注意。增加watcher,监听事件如果为SyncConnected,那么才做其他的操作。(利用CountDownLatch控制)
     20  * 2.监听事件是一次性的,如果操作多次需要注册多次(可以通过getData等方法)
     21  * ClassName: ZookeeperNative <br>
     22  * Description:  <br>
     23  * @author mk
     24  * @Date 2018-10-31 9:09 <br>
     25  * @version
     26  */
     27 public class ZookeeperNative {
     28 
     29     public static final String connect = "127.0.0.1:2181";
     30     private static ZooKeeper zookeeper = null;
     31     private static CountDownLatch cdl = new CountDownLatch(0);
     32     private static String nodePath = "/native1";
     33     private static String nodeChildPath = "/native1/n1/n11/n111/n1111";
     34 
     35     public static void main(String[] args) throws Exception {
     36 
     37         //初始化
     38         init(connect,5000);
     39 
     40         //新增
     41         create(nodePath,"n1");
     42         //递归新增
     43         createRecursion(nodeChildPath,"n1");
     44 
     45         //查询
     46         query(nodePath);
     47 
     48         //修改
     49         update(nodePath,"n11");
     50 
     51         //单个节点删除
     52 //        delete(nodePath);
     53         //递归删除
     54         deleteRecursion(nodePath);
     55     }
     56 
     57     private static void deleteRecursion(String nodePath) throws KeeperException, InterruptedException {
     58         Stat exists = zookeeper.exists(nodePath, true);
     59         if(null == exists){
     60             System.out.println(nodePath+"不存在");
     61             return ;
     62         }
     63 
     64         List<String> list = zookeeper.getChildren(nodePath, true);
     65         if(null == list || list.size() == 0){
     66             delete(nodePath);
     67             String parentPath = nodePath.substring(0,nodePath.lastIndexOf("/"));
     68             System.out.println("parentPath="+parentPath);
     69             if(!"".equals(parentPath)){
     70                 deleteRecursion(parentPath);
     71             }
     72         }else{
     73             for(String child : list){
     74                 deleteRecursion(nodePath+"/"+child);
     75             }
     76         }
     77     }
     78 
     79     private static void delete(String path) throws KeeperException, InterruptedException {
     80         query(path);//为了让watcher能被监听,在这里查询一次
     81         zookeeper.delete(path,-1);
     82         System.out.println("delete:"+"["+path+"]");
     83     }
     84 
     85     private static void update(String path, String data) throws KeeperException, InterruptedException {
     86         Stat stat = zookeeper.setData(path, data.getBytes(), -1);//versoin=-1代表不记录版本
     87         System.out.println("setData:"+"["+path+"],stat:"+stat);
     88     }
     89 
     90     private static void query(String path) throws KeeperException, InterruptedException {
     91         Stat stat = new Stat();
     92         byte[] data = zookeeper.getData(path, true, stat);
     93         System.out.println("query:"+"["+path+"],result:"+new String(data) + ",stat:"+stat);
     94     }
     95 
     96     private static void createRecursion(String path,String data) throws KeeperException, InterruptedException {
     97         if(null == path || "".equals(path)){
     98             System.out.println("节点["+path+"]为空");
     99             return;
    100         }
    101         String paths[] = path.substring(1,path.length()).split("/");
    102         for(int i=0;i<paths.length;i++){
    103             String childPath = "";
    104             for(int j=0;j<=i;j++){
    105                 childPath += "/" + paths[j];
    106             }
    107             create(childPath,data);
    108         }
    109 
    110         Stat exists = zookeeper.exists(path, true);
    111         if(null != exists){
    112             System.out.println("节点["+path+"]已存在,不能新增");
    113             return;
    114         }
    115         String result = zookeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    116         System.out.println("create:"+"["+path+"-->"+data+"],result:"+result);
    117     }
    118 
    119     private static void create(String path,String data) throws KeeperException, InterruptedException {
    120         Stat exists = zookeeper.exists(path, true);
    121         if(null != exists){
    122             System.out.println("节点["+path+"]已存在,不能新增");
    123             return;
    124         }
    125         String result = zookeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    126         System.out.println("create:"+"["+path+"-->"+data+"],result:"+result);
    127     }
    128 
    129     private static void init(final String connectStr, int sessionTimeout) throws Exception {
    130 //        zookeeper = new ZooKeeper(connectStr, sessionTimeout, null);
    131         //由于zookeeper连接是异步的,如果new ZooKeeper(connectStr, sessionTimeout, null)完之后马上使用,有可能会报错。
    132         //解决办法:增加watcher,监听事件如果为SyncConnected,那么才做其他的操作。(利用CountDownLatch控制)
    133         zookeeper = new ZooKeeper(connectStr, sessionTimeout, new Watcher() {
    134             @Override
    135             public void process(WatchedEvent watchedEvent) {
    136                 if(watchedEvent.getState() == Event.KeeperState.SyncConnected) {
    137 //                    System.out.println("zookeeper已连接["+connectStr+"]成功");
    138                     cdl.countDown();
    139                 }
    140                 if(watchedEvent.getType() == Event.EventType.NodeCreated){
    141                     System.out.println("zookeeper有新节点创建"+watchedEvent.getPath());
    142                 }
    143                 if(watchedEvent.getType() == Event.EventType.NodeDataChanged){
    144                     System.out.println("zookeeper有节点数据变化"+watchedEvent.getPath());
    145                 }
    146                 if(watchedEvent.getType() == Event.EventType.NodeDeleted){
    147                     System.out.println("zookeeper有节点被删除"+watchedEvent.getPath());
    148                 }
    149                 if(watchedEvent.getType() == Event.EventType.NodeChildrenChanged){
    150                     System.out.println("zookeeper有子节点变化"+watchedEvent.getPath());
    151                 }
    152             }
    153         });
    154         cdl.await();
    155         System.out.println("init start :" +zookeeper);
    156     }
    157 
    158 }

    运行结果:

     

  • 相关阅读:
    微信小程序,答题问卷,单选,多选混合在一个借口,前端怎么循环
    react 从0到1
    react从0到0
    es6 系统总结
    点击页面的某个元素,弹出这个元素的索引(是第几个)
    js return的用法
    安装golang.org/x/*
    完美解决从github上下载东西慢的方法
    初探golang和应用其框架 gin 的 使用教程(一)安装篇
    CentOS7安装go开发环境
  • 原文地址:https://www.cnblogs.com/lookupthesky/p/9881806.html
Copyright © 2011-2022 走看看