zookeeper+zKClient客户端的API使用

简介:

zkClient是一个开源的zookeeper客户端,内部针对zookeeper原生API进行了封装,让操作zookeeper更加的简单;同时zkClient内部还实现了诸如:Session超时重连;Warcher反复注册机制;

导入依赖:

     <!--zKClient -zookeeperApi调用-->
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.2</version>
        </dependency>

常用操作:

package com.example.liunx_demo.zookeeper.zkclient;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;

import java.util.List;

/**
 * @program: liunx_demo
 * @description:
 * @author: chenhu
 * @create: 2021-01-06 10:22
 **/
public class test {

    public static void main(String[] args) {

        /*连接会话
         * 创建一个zkClient实例就可以完成会话的连接
         * serverstring:连接的地址:ip:端口号
         * */
        ZkClient zkClient = new ZkClient("192.168.10.80:2181");
        System.err.println("会话创建成功");

        //==========================1:创建节点,同时递归创建子节点===========================================
        /*
            创建节点,同时递归创建子节点
            createParents:代表是否创建父节点,值为true代表先创建父节点在创建子节点,如果为false 代表只创建子节点
         */
        zkClient.createPersistent("/zkclient-data01/01-c2", true);
        System.err.println("节点递归创建完成");

        //===========================2:删除节点==========================================
        /*删除节点:递归删除节点,先删除该节点下的子节点,然后在删除该节点*/
//        zkClient.deleteRecursive("/zkclient-data01");
//        System.err.println("递归删除完成");

        //===========================3:获取某节点的子节点列表==========================================
        /*获取某节点的子节点列表*/
        List<String> children = zkClient.getChildren("/zkclient-data01");
        System.err.println(children);

        /*注册监听事件,
            path:代表为哪一个节点注册监听事件,当该节点发生变化时会调用handleChildChange()方法
            该方法可以对不存在的节点进行监听,当该节点的子节点列表或者该节点发生变更,会触发此监听
         */
        zkClient.subscribeChildChanges("/zkclient-data01", new IZkChildListener() {
            /*
                s :代表当前监听节点的所有父节点,也就是路径
                list :变化后的子节点列表
             */
            @Override
            public void handleChildChange(String s, List<String> list) throws Exception {
                System.err.println("s" + "的子节点列表发生了变化,变化后的子节点列表为:" + list);
            }
        });

        //============================5:判断节点是否存在=========================================
        /*判断节点是否存在*/
        boolean exists = zkClient.exists("/zkclient-data01");

        //============================6:创建节点,并给节点赋值=========================================
        /*创建节点,并给节点赋值*/
        zkClient.createPersistent("/zkclient-data02", "12345");

        //============================6:读取节点内容=========================================
        /*读取节点内容*/
        zkClient.readData("/zkclient-data02");

        /*注册监听事件,
            path:代表为哪一个节点注册监听事件,当该节点发生变化时会调用handleChildChange()方法
            该方法可以对存在的节点进行监听,当该节点的子节点列表或者该节点发生变更,会触发此监听
         */
        zkClient.subscribeDataChanges("/zkclient-data01", new IZkDataListener() {
            /*
                当节点数据内容发生变化时,执行的方法
                s:监听的节点
                o :节点变化后的内容
             */
            @Override
            public void handleDataChange(String s, Object o) throws Exception {
                System.err.println(s + "该节点内容被更新,更新后的内容:" + o);
            }

            /*
                当节点被删除时,执行的方法
                s:监听的节点
             */
            @Override
            public void handleDataDeleted(String s) throws Exception {
                System.err.println(s + "该节点内容被删除");
            }
    });
}
}

封装的工具类

package com.zk.zkclient;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;

import java.util.List;

/**
 * @Author: hu.chen
 * @Description:
 * @DateTime: 2021/12/29 10:15 AM
 **/
public class ZkClientUtils {

    private static ZkClient zkClient;

    private static final String address = "192.168.73.131:2191,192.168.73.131:2192,192.168.73.131:2193";

    static {
         /**
         * 连接会话
         * 第一个参数:zk服务器地址列表--连接的地址:ip:端口号
         * 第二个参数:会话超时时间
         * 第三个参数:连接超时时间
         */
        zkClient = new ZkClient(address, 30000, 50000);

    }


    /**
     * 创建持久节点,同时递归创建子节点
     * createParents:代表是否创建父节点,值为true代表先创建父节点在创建子节点,如果为false 代表只创建子节点
     */
    public static void createPersistent(String path) {
        zkClient.createPersistent(path, true);
    }

    /**
     * 创建持久节点,并给节点添加内容
     *
     * @param path
     * @param data
     */
    public static void createPersistent(String path, String data) {
        zkClient.createPersistent(path, data);
    }

    /**
     * 创建持久顺序节点,并给节点添加内容
     *
     * @param path
     * @param data
     */
    public static void createPersistentSequential(String path, String data) {
        zkClient.createPersistentSequential(path, data);
    }


    /**
     * 创建临时节点
     *
     * @param path 节点名称
     */
    public static void createEphemeral(String path) {
        zkClient.createEphemeral(path);
    }

    /**
     * 创建临时节点,并给节点添加内容
     *
     * @param path
     * @param data
     */
    public static void createEphemeral(String path, String data) {
        zkClient.createEphemeral(path, data);
    }

    /**
     * 创建临时顺序节点,并给节点添加内容
     *
     * @param path
     * @param data
     */
    public static void createEphemeralSequential(String path, String data) {
        zkClient.createEphemeralSequential(path, data);
    }

    /**
     * 删除节点:删除节点
     */
    public static void delete(String path) {
        zkClient.delete(path);
    }

    /**
     * 删除节点:递归删除节点,先删除该节点下的子节点,然后在删除该节点
     */
    public static void deleteRecursive(String path) {
        zkClient.deleteRecursive(path);
    }
    
        /**
     * 更改节点内容
     * @param path
     * @param data
     * @throws Exception
     */
    public static void updataNode(String path,String data) throws Exception {

        zkClient.writeData(path,data);
    }

    /**
     * 获取某节点的子节点列表
     */
    public static List<String> getNodes(String path) {
        List<String> nodes = zkClient.getChildren(path);
        return nodes;
    }

    /**
     * 给某个节点添加事件监听,当此节点的子节点列表发生变化时,会触发里面的 handleChildChange() 方法
     * 注意:原生的zkAPI的监听是一次性的,在监听触发后之前注册的监听就会失效,所以需要重新注册
     * 但是 ZkClient 实现了 反复注册监听的功能,所以再触发监听后不需要在重新注册
     * 
     * 
     *  new IZkChildListener() {
     *                     // s :代表当前监听节点的所有父节点,也就是路径
     *                     // list :变化后的子节点列表
     *                     @Override
     *                     public void handleChildChange(String path, List<String> list) throws Exception {
     *                         System.err.println(path + ": 的子节点列表发生了变化,变化后的子节点列表为:" + list);
     *
     *
     *                     }
     *                 }
     */
    public static void addNodeListener(String path, IZkChildListener childListener) {
        zkClient.subscribeChildChanges(path,childListener);
    }

    /**
     * 给某个节点添加事件监听,当此节点的子节点列表发生变化时,会触发里面的 handleChildChange() 方法
     * 注意:设置监听是一次性的,在监听触发后之前注册的监听就会失效,所以需要重新注册
     * 
     * new IZkDataListener() {
     *         // 当节点数据内容发生变化时,执行的方法
     *         // s:监听的节点
     *         // o :节点变化后的内容
     *         @Override
     *         public void handleDataChange (String s, Object o) throws Exception {
     *             System.err.println(s + "该节点内容被更新,更新后的内容:" + o);
     *
     *         }
     *
     *         // 当节点被删除时,执行的方法
     *         // s:监听的节点
     *         @Override
     *         public void handleDataDeleted (String s) throws Exception {
     *             System.err.println(s + "该节点内容被删除");
     *         }
     *     }
     */
    public static void addContentListener(String path, IZkDataListener dataListener) {
        zkClient.subscribeDataChanges(path,dataListener);
    }


    /**
     * 判断节点是否存在
     *
     * @param path
     * @return
     */
    public static boolean exists(String path) {

        return zkClient.exists(path);
    }

    /**
     * 读取节点内容
     *
     * @return
     */
    public static String readNode(String path) {
        Object o = zkClient.readData(path);
        return (String) o;
    }


}

测试调用工具类:

package com.zk.zkclient;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;

import java.util.List;

/**
 * @Author: hu.chen
 * @Description:
 * @DateTime: 2021/12/29 9:57 AM
 **/
public class Test {
    public static void main(String[] args) throws InterruptedException {


        List<String> nodes = ZkClientUtils.getNodes("/test-javaapi");

        // 给此节点注册子节点列表变更事件,当子节点列表发生变更时触发
        ZkClientUtils.addNodeListener("/test-javaapi", new IZkChildListener() {
            @Override
            public void handleChildChange(String s, List<String> list) throws Exception {
                System.err.println(s + "节点的子节点列表变更为:" + list);
            }
        });

        // 删除节点--非递归删除
//        ZkClientUtils.delete("/test-javaapi/c1");

        // 创建持久节点--递归创建
        ZkClientUtils.createPersistent("/test-javaapi/c1");

        Thread.sleep(5000);

//        ZkClientUtils.delete("/test-javaapi/c2");

        ZkClientUtils.createPersistent("/test-javaapi/c2");

        Thread.sleep(5000);
//        ZkClientUtils.delete("/test-javaapi/c3");

        ZkClientUtils.createPersistent("/test-javaapi/c3");

        System.err.println(nodes);

        Thread.sleep(Integer.MAX_VALUE);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值