• zkClient的使用


    ZKClient是由DataMeer的工程师StefanGroschupf和Peter Voss 一起开发的,在源生API接口基础上进行了封装,简化了ZK的复杂性。

    1、 创建客户端方法:ZKClient(Arguments)

    参数1:zkServers zookeeper服务器的地址,用“,”分割

    参数2:session Timeout超时会话,为毫秒,默认为30 000ms

    参数3:connection Timeout 连接超时会话

    参数4:IZKConnection接口实现类

    参数5:zkSerializer自定义序列化实现、

    2、创建节点方法:

    create、createEphemeral 、createEphemeralSequential、

    createPersistent、createPersistentSequential

    参数1: path 路径

    参数2: data 数据内容 可以为null

    参数3:mode 节点类型,为一个枚举类型,4种形式

    参数4: acl策略

    参数5: callback回调函数

    参数6:context 上下文对象

    参数7: createParents 是否创建父节点

    3、删除节点方法delete deleteRecursive

    参数1:path路径

    参数2:callback 回调函数

    参数3:context 上下文对象

    4、读取子节点数据方法:getChildren

    参数1:path路径

    5、读取节点数据方法:readData

    参数1:path路径

    参数2:returnNUllLfPathNotExists(避免为空节点抛出异常,直接返回null)

    参数3:节点状态

    6、更新数据方法writeData

    参数1:path 路径

    参数2:data数据信息

    参数3:version版本号

     1 package bjsxt.zkclient.base;
     2 
     3 import java.util.List;
     4 import java.util.concurrent.TimeUnit;
     5 
     6 import org.I0Itec.zkclient.ZkClient;
     7 import org.I0Itec.zkclient.ZkConnection;
     8 
     9 public class ZkClientBase {
    10 
    11     /** zookeeper地址 */
    12     static final String CONNECT_ADDR = "192.168.1.171:2181,192.168.1.172:2181,192.168.1.173:2181";
    13     /** session超时时间 */
    14     static final int SESSION_OUTTIME = 5000;//ms 
    15     
    16     
    17     public static void main(String[] args) throws Exception {
    18         ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), 5000);
    19         //1. create and delete方法 
    20         zkc.createEphemeral("/temp");
    21         zkc.createPersistent("/super/c1", true);
    22         Thread.sleep(10000);
    23         zkc.delete("/temp");
    24         zkc.deleteRecursive("/super");
    25         
    26         //2. 设置path和data 并且读取子节点和每个节点的内容
    27 //        zkc.createPersistent("/super", "1234");
    28 //        zkc.createPersistent("/super/c1", "c1内容");
    29 //        zkc.createPersistent("/super/c2", "c2内容");
    30 //        List<String> list = zkc.getChildren("/super");
    31 //        for(String p : list){
    32 //            System.out.println(p);
    33 //            String rp = "/super/" + p;
    34 //            String data = zkc.readData(rp);
    35 //            System.out.println("节点为:" + rp + ",内容为: " + data);
    36 //        }
    37         
    38         //3. 更新和判断节点是否存在
    39 //        zkc.writeData("/super/c1", "新内容");
    40 //        System.out.println(zkc.readData("/super/c1"));
    41 //        System.out.println(zkc.exists("/super/c1"));
    42         
    43         //4.递归删除/super内容
    44 //        zkc.deleteRecursive("/super");        
    45     }
    46 }

    7、检测节点是否存在方法 exists

    参数1:path

    我们发现。上述ZkClient里面并没有类似的watcher,watch参数,这也就是说我们开发人员无需关心反复注册Watcher的问题,ZkClient给我们提供了一套监听方式,我们可以使用监听节点的方式进行操作,剔除了繁琐的反复wather操作,简化了代码复杂程度、

    8、subscribeChildChanges方法

    参数1:path路径

    参数2:实现了lZkChildListener接口的类(如:实例化lZkChildListener类)

    只需要重写其handleChildChanges(String parentPath,List<String> currentChilds)方法,其中参数parentPath 为所监听节点全路径,

    currentChilds为最新的子节点列表(相对路径)

    lZkChildListener事件说明针对于下面三个事件触发:

    新增子节点,减少子节点,删除节点

    lZkChildListener有以下特点:

    1、客户端可以对一个不存在的节点进行变更的监听

    2、一旦客户端对一个节点注册了子节点列表变更监听后,那么当前节点的子节点列表发送变更的时候,服务器端都会通知客户端,并将最新的子节点列表发给客户端

    3、该节点本身创建或删除也会通知到客户端

    4、这个监听一直存在,不是单次监听,比元素API简单

     1 package bjsxt.zkclient.watcher;
     2 
     3 import java.util.List;
     4 
     5 import org.I0Itec.zkclient.IZkChildListener;
     6 import org.I0Itec.zkclient.ZkClient;
     7 import org.I0Itec.zkclient.ZkConnection;
     8 
     9 public class ZkClientWatcher1 {
    10 
    11     /** zookeeper地址 */
    12     static final String CONNECT_ADDR = "192.168.1.171:2181,192.168.1.172:2181,192.168.1.173:2181";
    13     /** session超时时间 */
    14     static final int SESSION_OUTTIME = 5000;//ms 
    15     
    16     
    17     public static void main(String[] args) throws Exception {
    18         ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), 5000);
    19         
    20         //对父节点添加监听子节点变化。
    21         zkc.subscribeChildChanges("/super", new IZkChildListener() {
    22             @Override
    23             public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
    24                 System.out.println("parentPath: " + parentPath);
    25                 System.out.println("currentChilds: " + currentChilds);
    26             }
    27         });
    28         
    29         Thread.sleep(3000);
    30         
    31         zkc.createPersistent("/super");
    32         Thread.sleep(1000);
    33         
    34         zkc.createPersistent("/super" + "/" + "c1", "c1内容");
    35         Thread.sleep(1000);
    36         
    37         zkc.createPersistent("/super" + "/" + "c2", "c2内容");
    38         Thread.sleep(1000);        
    39         
    40         zkc.delete("/super/c2");
    41         Thread.sleep(1000);    
    42         
    43         zkc.deleteRecursive("/super");
    44         Thread.sleep(Integer.MAX_VALUE);
    45         
    46         
    47     }
    48 }
    package bjsxt.zkclient.watcher;
    
    import org.I0Itec.zkclient.IZkDataListener;
    import org.I0Itec.zkclient.ZkClient;
    import org.I0Itec.zkclient.ZkConnection;
    
    public class ZkClientWatcher2 {
    
        /** zookeeper地址 */
        static final String CONNECT_ADDR = "192.168.1.171:2181,192.168.1.172:2181,192.168.1.173:2181";
        /** session超时时间 */
        static final int SESSION_OUTTIME = 5000;//ms 
        
        
        public static void main(String[] args) throws Exception {
            ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), 5000);
            
            zkc.createPersistent("/super", "1234");
            
            //对父节点添加监听子节点变化。
            zkc.subscribeDataChanges("/super", new IZkDataListener() {
                @Override
                public void handleDataDeleted(String path) throws Exception {
                    System.out.println("删除的节点为:" + path);
                }
                
                @Override
                public void handleDataChange(String path, Object data) throws Exception {
                    System.out.println("变更的节点为:" + path + ", 变更内容为:" + data);
                }
            });
            
            Thread.sleep(3000);
            zkc.writeData("/super", "456", -1);
            Thread.sleep(1000);
    
            zkc.delete("/super");
            Thread.sleep(Integer.MAX_VALUE);
            
            
        }
    }
  • 相关阅读:
    JavaScript观察者模式
    JavaScript装饰者模式
    使用uni-app开发小程序,关于小程序更新后与用户本地不会及时更新解决办法
    6.3 基于二分搜索树、链表的实现的集合Set复杂度分析
    解决uni-app props 传递数组修改后不能使用问题
    6.2 集合和映射--集合Set->底层基于链表实现
    6.1 集合和映射--集合Set->底层基于二叉搜索树实现
    【刷题记录
    【codeforces
    【loj
  • 原文地址:https://www.cnblogs.com/shmilyToHu/p/9113240.html
Copyright © 2020-2023  润新知