Open Source, Open Future!
  menu
107 文章
ღゝ◡╹)ノ❤️

zookeeper---客户端---ZKClient

简介

ZKClient是Github上的一个开源的Zookeeper客户端,他在原生API接口上做了包装;同时在内部实现了诸如Session超时重连、Watcher反复注册等功能。

引入依赖

        <dependency>
           <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>

创建与关闭连接

    private String zkServers = "192.168.1.201:2181";
    private int connectionTimeout = 10000;
    private ZkClient client;

    @Before
    public void init() {
        client = new ZkClient(zkServers, connectionTimeout);
        System.out.println("连接创建成功");
    }

    @After
    public void close() {
        client.close();
        System.out.println("连接关闭成功");
    }

创建节点

    @Test
    public void createTest() {
        // 创建持久节点
        client.createPersistent("/h", "1");
        System.out.println("创建持久节点完成");
        // 创建持久顺序节点
        String node2 = client.createPersistentSequential("/i", "2");
        System.out.println("创建持久顺序节点: " + node2);
        // 创建临时节点
        client.createEphemeral("/j", "3");
        System.out.println("创建临时节点完成");
        // 创建临时顺序节点
        String node4 = client.createEphemeralSequential("/k", "4");
        System.out.println("创建临时顺序节点: " + node4);
        // 创建节点时,如果父节点不存在则同时创建父节点
        client.createPersistent("/L/L1/L11",true);
        // 创建节点,不传值,默认为null
        client.createPersistent("/m");
    }

获取子节点

    @Test
    public void getChildrenTest() {
        // 获取子节点
        System.out.println(client.getChildren("/"));
    }

获取子节点(动态刷新)

    @Test
    public void getChildren2Test() throws Exception {
        // 获取子节点
        client.subscribeChildChanges("/h", new IZkChildListener() {
            public void handleChildChange(String parentPath, List<String> currentChilds) {
                System.out.println("------子节点列表发生变化------");
                System.out.println(currentChilds);
                System.out.println("------------");
            }
        });
        Thread.sleep(Integer.MAX_VALUE);
    }

1、当创建节点/h/h1时
image.png
自动输出以下内容:
image.png
2、当删除节点/c/c1时,自动输出以下内容:
image.png

查询节点数据

    @Test
    public void readDataTest() {
        // 查询节点数据
        System.out.println(client.readData("/h"));
    }

查询节点数据(动态)

    @Test
    public void readData2Test() throws Exception{
        client.subscribeDataChanges("/h", new IZkDataListener() {
            @Override
            public void handleDataChange(String dataPath, Object data) {
                System.out.println("节点" + dataPath + " 数据变更为:" + data);
            }
            @Override
            public void handleDataDeleted(String dataPath) {
                System.out.println("节点 " + dataPath + " 被删除");
            }
        });
        Thread.sleep(Integer.MAX_VALUE);
    }

修改节点数据

    @Test
    public void writeDataTest() {
        // 修改节点数据
        client.writeData("/h","1-1");
    }

删除节点

    @Test
    public void deleteTest() {
        // 删除节点
        client.delete("/h");
    }