• Zookeeper客户端使用(使用Curator)


     

    Zookeeper客户端(使用Curator)

     

     

    三、使用curator客户端

    在pom.xml中加入依赖

    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-framework</artifactId>
      <version>2.12.0</version>
    </dependency>
    
    <dependency>
      <groupId>org.apache.curator</groupId>
      <artifactId>curator-recipes</artifactId>
      <version>2.11.0</version>
    </dependency>

    直接上代码:

      1 /**
      2  * Project Name:mk-project <br>
      3  * Package Name:com.suns.zookeeper.curator <br>
      4  *
      5  * @author mk <br>
      6  * Date:2018-10-31 14:03 <br>
      7  */
      8 
      9 package com.suns.zookeeper.curator;
     10 
     11 import org.apache.curator.RetryPolicy;
     12 import org.apache.curator.framework.CuratorFramework;
     13 import org.apache.curator.framework.CuratorFrameworkFactory;
     14 import org.apache.curator.framework.recipes.cache.*;
     15 import org.apache.curator.retry.ExponentialBackoffRetry;
     16 import org.apache.zookeeper.CreateMode;
     17 import org.apache.zookeeper.data.Stat;
     18 
     19 import java.util.concurrent.TimeUnit;
     20 
     21 /**
     22  * curator客户端使用
     23  *
     24  *  和原生zookeeper优点:
     25  *  1.使用api更方便,功能更丰富
     26  *  2.监听节点数据改变或者子节点变化,只需要订阅一次,便可以一直使用。而原生zookeeper的监听是一次性的,需要重复注册。
     27  *  3.链式编程
     28  *
     29  * Curator包含了几个包:
     30  * curator-framework:对zookeeper的底层api的一些封装
     31  * curator-client:提供一些客户端的操作,例如重试策略等
     32  * curator-recipes:封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式计数器、分布式Barrier等
     33  * ClassName: ZkCuratorTest <br>
     34  * Description:  <br>
     35  * @author mk
     36  * @Date 2018-10-31 14:03 <br>
     37  * @version
     38  */
     39 public class ZkCuratorTest {
     40 
     41     public static final String connect = "127.0.0.1:2181";
     42     private static CuratorFramework curatorFramework = null;
     43     private static String nodePath = "/curator1";
     44     private static String nodeChildPath = "/curator1/n1/n11/n111/n1111";
     45 
     46     public static void main(String[] args) throws Exception {
     47 
     48         //初始化
     49         init(connect,5000);
     50 
     51         //监听节点数据改变或者子节点变化,只需要订阅一次,便可以一直使用。而原生zookeeper的监听是一次性的,需要重复注册。
     52         listener(nodePath);
     53 
     54         //新增
     55         create(nodePath,"n1");
     56         //递归新增
     57         createRecursion(nodeChildPath,"n1");
     58 
     59         //查询
     60         query(nodePath);
     61 
     62         TimeUnit.SECONDS.sleep(2);
     63 
     64         //修改
     65         update(nodePath,"n11");
     66 
     67         //单个节点删除
     68 //        delete(nodePath);
     69         //递归删除
     70         deleteRecursion(nodePath);
     71 
     72     }
     73 
     74     private static void deleteRecursion(String path) throws Exception {
     75         Void aVoid = curatorFramework.delete().deletingChildrenIfNeeded().forPath(path);
     76         System.out.println("delete:"+"["+path+"],result:"+aVoid);
     77     }
     78 
     79     private static void delete(String path) throws Exception {
     80         Void aVoid = curatorFramework.delete().forPath(path);
     81         System.out.println("delete:"+"["+path+"],result:"+aVoid);
     82 
     83     }
     84 
     85     private static void update(String path, String data) throws Exception {
     86         Stat stat = curatorFramework.setData().forPath(path, data.getBytes());
     87         System.out.println("setData:"+"["+path+"],stat:"+stat);
     88 
     89     }
     90 
     91     private static void query(String path) throws Exception {
     92         byte[] bytes = curatorFramework.getData().forPath(path);
     93         System.out.println("query:"+"["+path+"],result:"+new String(bytes));
     94 
     95     }
     96 
     97     private static void createRecursion(String path,String data) throws Exception {
     98         String result = curatorFramework.create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).forPath(path, data.getBytes());
     99         System.out.println("create:"+"["+path+"-->"+data+"],result:"+result);
    100 
    101     }
    102 
    103     private static void create(String path, String data) throws Exception {
    104 //        Stat stat = curatorFramework.checkExists().forPath(path);
    105 //        if(null != stat){
    106 //            System.out.println("节点["+path+"]已存在,不能新增");
    107 //            return;
    108 //        }
    109         String result = curatorFramework.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(path, data.getBytes());
    110         System.out.println("create:"+"["+path+"-->"+data+"],result:"+result);
    111     }
    112 
    113     private static void listener(String path) throws Exception {
    114 
    115         //监听节点内容改变
    116         final NodeCache nodeCache = new NodeCache(curatorFramework, path);
    117         nodeCache.start();
    118         /*nodeCache.getListenable().addListener(new NodeCacheListener() {
    119             @Override
    120             public void nodeChanged() throws Exception {
    121                 System.out.println("节点内容发生变化----->"+nodeCache.getCurrentData());
    122             }
    123         });*/
    124 
    125         //使用lambda表达式-jdk1.8以上
    126         nodeCache.getListenable().addListener(()->{System.out.println("节点内容发生变化----->"+nodeCache.getCurrentData());});
    127 
    128 
    129         //监听子节点改变
    130         final PathChildrenCache pathChildrenCache = new PathChildrenCache(curatorFramework, path, true);
    131         pathChildrenCache.start(PathChildrenCache.StartMode.POST_INITIALIZED_EVENT);
    132       /*  pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
    133             @Override
    134             public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {
    135                 switch (pathChildrenCacheEvent.getType() ){
    136                     case CHILD_ADDED:
    137                         System.out.println("新增子节点"+pathChildrenCache.getCurrentData());
    138                         break;
    139                     case CHILD_UPDATED:
    140                         System.out.println("更新子节点"+pathChildrenCache.getCurrentData());
    141                         break;
    142                     case CHILD_REMOVED:
    143                         System.out.println("删除子节点"+pathChildrenCache.getCurrentData());
    144                         break;
    145                     default:break;
    146                 }
    147             }
    148         });*/
    149         //使用lambda表达式-jdk1.8以上
    150         pathChildrenCache.getListenable().addListener((curatorFramework,pathChildrenCacheEvent)->
    151             {switch (pathChildrenCacheEvent.getType() ){
    152                 case CHILD_ADDED:
    153                     System.out.println("新增子节点"+pathChildrenCache.getCurrentData());
    154                     break;
    155                 case CHILD_UPDATED:
    156                     System.out.println("更新子节点"+pathChildrenCache.getCurrentData());
    157                     break;
    158                 case CHILD_REMOVED:
    159                     System.out.println("删除子节点"+pathChildrenCache.getCurrentData());
    160                     break;
    161                 default:break;
    162             }});
    163 
    164 
    165     }
    166 
    167     private static void init(String connect, int sessionTimeout) {
    168         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);//重试策略,初始等待1s,重试3次
    169         //通过工厂获得CuratorFramework
    170         curatorFramework = CuratorFrameworkFactory.builder()
    171                 .connectString(connect).connectionTimeoutMs(sessionTimeout).retryPolicy(retryPolicy).build();
    172         curatorFramework.start();//开启连接
    173         System.out.println("curatorFramework start :" +connect);
    174     }
    175 
    176 }

    运行截图:



  • 相关阅读:

    (luogu)[模板]最长公共子序列
    表达式的值
    邮票面值设计
    尼克的任务
    HISTOGRA
    消防局的设立
    青蛙的约会
    产生数
    奇怪的电梯
  • 原文地址:https://www.cnblogs.com/lookupthesky/p/9883188.html
Copyright © 2020-2023  润新知