Zookeeper-开源客户端-ZkClient简单使用

ZkClient

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

接下来,从创建会话、创建节点、读取数据、更新数据、删除节点等方面来介绍如果使用zkClient

添加依赖

 <dependency>
   <groupId>com.101tec</groupId>
   <artifactId>zkclient</artifactId>
   <version>0.2</version>
</dependency>

创建会话

import org.I0Itec.zkclient.ZkClient;

public class CreateSession {

    public static void main(String[] args) {
        createSession("127.0.0.1:2181");
    }

    /**
     * 创建一个zkclient实例就可以完成连接,完成会话的创建
     * zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
     *
     * @param serverString 服务器连接地址
     */
    private static void createSession(String serverString) {
        ZkClient zkClient = new ZkClient(serverString);
        System.out.println("会话被创建了..");
    }
}

创建节点

import org.I0Itec.zkclient.ZkClient;

public class Create_Note {

    public static void main(String[] args) {

        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
        System.out.println("会话被创建了..");

        //创建持久节点,如果当前节点的父节点不存在就会报错,默认不会递归创建父节点
        zkClient.createPersistent("/lg-zkclient-1");

        //创建持久节点,第二个参数表示是否创建父节点,如果值为true,那么就会递归创建父节点
        zkClient.createPersistent("/lg-zkclient-2/c1", true);

        //创建持久节点,同时设置内容为123,上面两种方式的节点内容为空
        zkClient.createPersistent("/lg-zkclient-3", "123");

        //创建临时节点
        zkClient.createEphemeral("/lg-temp-1");

        //创建临时节点,同时设置节点内容
        zkClient.createEphemeral("/lg-temp-2", "123");

        //创建持久顺序节点,同时设置节点内容
        zkClient.createPersistentSequential("/lg-zkclient-4", "123");

        //创建临时顺序节点,同时设置节点内容
        zkClient.createEphemeralSequential("/lg-temp-3", "345");
    }
}

删除节点

import org.I0Itec.zkclient.ZkClient;

public class Delete_Note {

    public static void main(String[] args) {

        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
        System.out.println("会话被创建了..");

        //删除节点,如果存在子节点会报错,需要手动删除子节点
        zkClient.delete("/lg-zkclient-2");

        // 递归删除节点,会自动删除子节点
        String path = "/lg-zkclient-2/c1";
        zkClient.createPersistent(path+"/c11");
        zkClient.deleteRecursive(path);
    }
}

获取节点列表及数据

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

import java.util.List;

public class Get_NoteChildren {

    public static void main(String[] args) throws InterruptedException {

        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
        System.out.println("会话被创建了..");

        // 获取子节点列表
        List<String> children = zkClient.getChildren("/lg-zkclient-1");
        System.out.println(children);

        //读取节点内容
        Object obj = zkClient.readData("/lg-zkclient-3");
        System.out.println(obj.toString());

        // 注册监听事件
        //客户端可以对一个不存在的节点进行子节点变更的监听
        //只要该节点的子节点列表发生变化,或者该节点本身被创建或者删除,都会触发监听
        zkClient.subscribeChildChanges("/lg-zkclient-get", new IZkChildListener() {

            public void handleChildChange(String parentPath, List<String> list) throws Exception {
                System.out.println(parentPath + "的子节点列表发生了变化,变化后的子节点列表为" + list);
            }
        });

        //测试
        zkClient.createPersistent("/lg-zkclient-get");
        Thread.sleep(1000);

        zkClient.createPersistent("/lg-zkclient-get/c1");
        Thread.sleep(1000);
    }
}

更新数据

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

public class Note_API {

    public static void main(String[] args) throws InterruptedException {

        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
        System.out.println("会话被创建了..");

        // 判断节点是否存在
        String path = "/lg-zkClient-Ep";
        boolean exists = zkClient.exists(path);

        if(!exists){
            // 创建临时节点
            zkClient.createEphemeral(path,"123");
        }

        // 读取节点内容
        Object o = zkClient.readData(path);
        System.out.println(o);

        // 注册监听
        zkClient.subscribeDataChanges(path, new IZkDataListener() {

            /*
                当节点数据内容发生变化时,执行的回调方法
                s: path
                o: 变化后的节点内容
             */
            public void handleDataChange(String s, Object o) throws Exception {
                System.out.println(s+"该节点内容被更新,更新的内容"+o);
            }

            /*
                当节点被删除时,会执行的回调方法
                s : path
             */
            public void handleDataDeleted(String s) throws Exception {
                System.out.println(s+"该节点被删除");
            }
        });
        
        // 更新节点内容
        zkClient.writeData(path,"456");
        Thread.sleep(1000);

        // 删除节点
        zkClient.delete(path);
        Thread.sleep(1000);
    }
}
©️2020 CSDN 皮肤主题: 黑客帝国 设计师:上身试试 返回首页