• 七:zooKeeper开源客户端ZkClient的api测试


    ZkClient是Gitthub上一个开源的ZooKeeper客户端。ZKClient在ZooKeeper原生API接口之上进行了包装,是一个更加易用的ZooKeeper客户端。同时ZKClient在内部实现诸如Session超时重连,Watcher反复注册等功能。

    一:maven依赖

     1  <dependency>
     2       <groupId>org.apache.zookeeper</groupId>
     3       <artifactId>zookeeper</artifactId>
     4       <version>3.4.6</version>
     5     </dependency>
     6     <dependency>
     7       <groupId>com.101tec</groupId>
     8       <artifactId>zkclient</artifactId>
     9       <version>0.5</version>
    10     </dependency>
    View Code

    二:一个java存储实体

     1 package com.yeepay.sxf.testZkClient;
     2 
     3 import java.io.Serializable;
     4 
     5 
     6 /**
     7  * 用户对象
     8  * @author sxf
     9  *
    10  */
    11 public class User implements Serializable{
    12     private int id;
    13     private String name;
    14     private String address;
    15     
    16     
    17     public int getId() {
    18         return id;
    19     }
    20     public void setId(int id) {
    21         this.id = id;
    22     }
    23     public String getName() {
    24         return name;
    25     }
    26     public void setName(String name) {
    27         this.name = name;
    28     }
    29     public String getAddress() {
    30         return address;
    31     }
    32     public void setAddress(String address) {
    33         this.address = address;
    34     }
    35     
    36 }
    View Code

    三:测试源代码

      1 package com.yeepay.sxf.testZkClient;
      2 
      3 import java.util.List;
      4 
      5 import org.I0Itec.zkclient.IZkChildListener;
      6 import org.I0Itec.zkclient.IZkDataListener;
      7 import org.I0Itec.zkclient.ZkClient;
      8 import org.I0Itec.zkclient.serialize.BytesPushThroughSerializer;
      9 import org.apache.zookeeper.CreateMode;
     10 import org.apache.zookeeper.data.Stat;
     11 /**
     12  * zkclient的api测试
     13  * acl权限相关操作和原生zookeeper客户端一样
     14  * @author sxf
     15  *
     16  */
     17 public class CreateSession {
     18 
     19     public static void main(String[] args) throws InterruptedException {
     20         //第一个参数:zk的ip:端口号
     21         //会话过期时间
     22         //链接超时时间
     23         //序列化器(将java对象转化成byte数组,得到时从byte数组反序列化成java对象)这个序列化器在事件订阅上,修改数据一定要保持一致,否则无效果
     24         //ZkClient zkClient=new ZkClient("10.151.30.75:2181", 10000, 10000, new SerializableSerializer());
     25         
     26         //这个客户端链接,传入的序列化器皿等于什么都没做
     27         ZkClient zkClient=new ZkClient("10.151.30.75:2181", 10000, 10000, new BytesPushThroughSerializer());
     28         
     29         //创建一个节点
     30         //createNode(zkClient);
     31         
     32         //获取一个节点中存取的值
     33         //getNodeValue(zkClient);
     34         
     35         //获取一个节点下的子节点列表
     36         //getNodeChildList(zkClient);
     37         
     38         //判断一个节点是否存在
     39         //isNodeExists(zkClient);
     40         
     41         //删除一个节点
     42         //deleteNode(zkClient);
     43         
     44         //修改一个节点的数据
     45         //updateNodeValue(zkClient);
     46         
     47         //为某个节点的子节点列表发生变化订阅一个事件
     48         //whenChildListChangeThenDoSomeThing(zkClient);
     49         
     50         //为某个节点存储的值发生变化或者节点被删除订阅一个事件
     51         whenNodeValueChangeThenDoThing(zkClient);
     52         
     53         Thread.sleep(Integer.MAX_VALUE);
     54     }
     55     
     56     
     57     /**
     58      * 创建一个node节点
     59      * @param zkClient
     60      */
     61     public static void createNode(ZkClient zkClient){
     62         //user 对象必须实现序列化接口Serializable
     63         User user=new User();
     64         user.setId(1);
     65         user.setName("shangxiaofei");
     66         user.setAddress("smx");
     67         //(节点路径,节点数据,持久节点)
     68         String path=zkClient.create("/node_131", user, CreateMode.PERSISTENT);
     69         System.out.println("CreateSession.createNode(创建节点路径为:)"+path);
     70     }
     71     
     72     /**
     73      * 获取一个节点中存取的值
     74      * @param zkClient
     75      */
     76     public static void getNodeValue(ZkClient zkClient){
     77         
     78         Stat stat=new Stat();
     79         //获取一个节点中存取的值
     80         User user=zkClient.readData("/node_131",stat);
     81         System.out.println("CreateSession.getNodeValue(id==>)"+user.getId());
     82         System.out.println("CreateSession.getNodeValue(name==>)"+user.getName());
     83         System.out.println("CreateSession.getNodeValue(address==>)"+user.getAddress());
     84         System.out.println("CreateSession.getNodeValue(节点状态==>)"+stat);
     85     }
     86     
     87     /**
     88      * 获取某个节点的子节点列表
     89      * @param zkClient
     90      */
     91     public static void getNodeChildList(ZkClient zkClient){
     92         
     93         List<String> nodesList=zkClient.getChildren("/");
     94         System.out.println("CreateSession.getNodeChildList(“/”下的子节点列表为=>)"+nodesList);
     95     }
     96     
     97     /**
     98      * 检测某一个节点是否存在
     99      * @param zkClient
    100      */
    101     public static void isNodeExists(ZkClient zkClient){
    102         boolean flag=zkClient.exists("/node_132");
    103         System.out.println("CreateSession.isNodeExists(节点是否存在的结果)"+flag);
    104     }
    105     
    106     
    107     /**
    108      * 删除一个节点或删除存在子节点的节点
    109      * @param zkClient
    110      */
    111     public static void deleteNode(ZkClient zkClient){
    112         //删除无子节点的节点。如果存在子节点,抛出异常
    113         boolean flag=zkClient.delete("/node_131");
    114         System.out.println("CreateSession.deleteNode(删除无子节点的节点结果==>)"+flag);
    115             
    116         //删除存在子节点的节点。先深入子节点,删除掉所有子节点的节点,再删除当前节点
    117         boolean flag2=zkClient.deleteRecursive("/node_131");
    118         System.out.println("CreateSession.deleteNode(删除存在子节点的节点结果==>)"+flag2);
    119     }
    120     
    121     /**
    122      * 修改一个数据节点中存储的值
    123      * @param zkClient
    124      */
    125     public static void updateNodeValue(ZkClient zkClient){
    126         User user=new User();
    127         user.setId(100);
    128         user.setName("shangxiaoshuai");
    129         user.setAddress("smxcyxzyc");
    130         //修改一个节点中存储的数据
    131         zkClient.writeData("/node_131", user);
    132         
    133         //修改一个节点中存储的数据,实现类似乐观锁的功能
    134         zkClient.writeData("/node_131", user, 1);
    135     }
    136     
    137     
    138     /**
    139      * 当子节点列表发生变化,则触发一个事件
    140      */
    141     public static void whenChildListChangeThenDoSomeThing(ZkClient zkClient){
    142         /**
    143          * 可以监听(1)子节点列表发生变化,增加新子节点,删除子节点
    144          * (2)节点本身被删除
    145          *    (3)节点本身被创建,意味着可以订阅一个并不存在的节点的监听事件
    146          */
    147                         
    148         zkClient.subscribeChildChanges("/node_132", new WhenChildChangeThing());
    149     }
    150     /**
    151      * 当子节点列表发生变化的事件实现类
    152      * @author sxf
    153      *
    154      */
    155     private static class WhenChildChangeThing implements IZkChildListener{
    156 
    157         @Override
    158         public void handleChildChange(String parentPath,List<String> currentChilds) throws Exception {
    159                 System.out.println("节点列表变化的父节点路径==>"+parentPath);
    160                 System.out.println("当前的节点列表==>"+currentChilds);
    161         }
    162         
    163     }
    164     
    165     /**
    166      * 为节点数据内容发生变化订阅一个事件
    167      * @param zkClient
    168      */
    169     public static void whenNodeValueChangeThenDoThing(ZkClient zkClient){
    170         zkClient.subscribeDataChanges("/node_132", new WhenNodeValueChange());
    171     }
    172     /**
    173      * 当数据节点存储的值发生变化的事件监听类
    174      * @author sxf
    175      *
    176      */
    177     private static class WhenNodeValueChange implements IZkDataListener{
    178 
    179         //当节点数据内容发生变化这个函数被调用
    180         @Override
    181         public void handleDataChange(String dataPath, Object data)
    182                 throws Exception {
    183             System.out.println("节点数据内容发生变化,变化后的值为==>"+data);
    184             System.out.println("节点数据内容发生变化,变化节点的路径==>"+dataPath);
    185         }
    186 
    187         //当节点被删除时这个函数被调用
    188         @Override
    189         public void handleDataDeleted(String dataPath) throws Exception {
    190             System.out.println("节点被删除的路径为==>"+dataPath);
    191         }
    192         
    193     }
    194 }
    View Code
  • 相关阅读:
    【5】Python之nnlog写日志模块,yagmail发送邮件模块
    【11】Python面向对象:封装和继承(类、函数/方法、重写)
    【5】Java继承
    【4】作业:办公信息化管理系统
    【3】综合案例:学生信息管理
    【2】Java封装
    【1】java面向对象
    【9】综合案例:数组移位与统计
    【8】Java方法
    【7】Java数组之二维数组
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/5219937.html
Copyright © 2020-2023  润新知