zookeeper之ZkClient使用

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

添加依赖:

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.5.6</version>
</dependency>

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

创建获取zkclient的工具类:

package com.zkclient;

import org.I0Itec.zkclient.ZkClient;

public class ZkClientTool {
    /**
     * 获取zkClien
     * @return
     */
    public static ZkClient getZkClient() {
        //获取zkclent new SerializableSerializer()是序列化器,可以直接传入对象,也可以直接读取,序列化器为我们完成序列化和反序列化
        ZkClient zkClient = new ZkClient("192.168.40.135:2181", 10000, 500000, new MySerializer());
        return zkClient;
    }
}

创建节点:

package com.zkclient;

import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.CreateMode;

public class CreateNode {
    public static void main(String[] args) {
        ZkClient zkCliet = ZkClientTool.getZkClient();
        User user = User.builder().id(1).name("zzz").build();
        String path = zkCliet.create("/node_2", user, CreateMode.PERSISTENT);
        System.out.println(path);
    }
}

获取节点值:

package com.zkclient;

import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.data.Stat;

public class GetNodeData {
    public static void main(String[] args) {
        ZkClient zkCliet = ZkClientTool.getZkClient();
        //如果获取节点状态,将stat作为参数传入即可
        Stat stat = new Stat();
        String user = zkCliet.readData("/node_2", stat);
        System.out.println("user:" + user);
        System.out.println("stat" + stat);
    }
}

获取子节点信息:

package com.zkclient;

import org.I0Itec.zkclient.ZkClient;

import java.util.List;

public class GetChildNode {
    public static void main(String[] args) {
        ZkClient zkCliet = ZkClientTool.getZkClient();
        List<String> children = zkCliet.getChildren("/node_2");
        System.out.println("children" + children.toString());
    }
}

检测某个节点是否存在:

package com.zkclient;

import org.I0Itec.zkclient.ZkClient;

public class NodeExits {
    public static void main(String[] args) {
        ZkClient zkCliet = ZkClientTool.getZkClient();
        boolean exists = zkCliet.exists("/node_2");
        System.out.println("exists:" + exists);
    }
}

删除节点:

package com.zkclient;

import org.I0Itec.zkclient.ZkClient;

public class DeleteNode {
    public static void main(String[] args) {
        ZkClient zkCliet = ZkClientTool.getZkClient();
        boolean node_2 = zkCliet.delete("node_2");
        System.out.println("delete node_2:" + node_2);
        //如果节点有子节点,使用deleteRecursive循环删除
        boolean node_21 = zkCliet.deleteRecursive("node_2");
        System.out.println("contains child delete node_21:" + node_21);
    }
}

如果有子节点会报错:

需要用deleteRecursive删除:

节点修改:

package com.zkclient;

import org.I0Itec.zkclient.ZkClient;

public class WriteData {
    public static void main(String[] args) {
        ZkClient zkCliet = ZkClientTool.getZkClient();
        Object oldDate = zkCliet.readData("/node_1");
        System.out.println("oldDate:" + oldDate);
        zkCliet.writeData("/node_1", "zkca");
        Object newDate = zkCliet.readData("/node_1");
        System.out.println("newDate:" + newDate);
    }
}

事件订阅:

可以订阅两种事件:

1.节点的子节点列表发生变化

2.节点本身数据发生变化

首先看节点的子节点的变化的事件订阅

package com.zkclient;

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

import java.util.List;

public class SubScribeChildChange {
    private static class ZkChildChangeListener implements IZkChildListener {

        public void handleChildChange(String parentPath, List<String> childrenList) throws Exception {
            System.out.println("parentPath:" + parentPath);
            System.out.println("childrenList:" + childrenList.toString());

        }
    }
    public static void main(String[] args) throws InterruptedException {
        ZkClient zkCliet = ZkClientTool.getZkClient();
        //可以监听:给node_1添加子节点、删除子节点甚至node_1节点本身的创建和删除
        zkCliet.subscribeChildChanges("/node_1", new ZkChildChangeListener());
        Thread.sleep(Integer.MAX_VALUE);
    }
}

删除该节点下的子节点:

删除本身节点:

创建本身节点:

节点本身数据发生变化的事件订阅:

package com.zkclient;

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

public class SubScribeDateChange {
    private static class ZkChildChangeListener implements IZkDataListener {

        public void handleDataChange(String datePath, Object date) throws Exception {
            System.out.println("datePath:" + datePath);
            System.out.println("date:" + date);
        }

        public void handleDataDeleted(String s) throws Exception {
            //触发删除的事件通知:
            System.out.println("s:" + s);
        }
    }
    public static void main(String[] args) throws InterruptedException {
        ZkClient zkCliet = ZkClientTool.getZkClient();
        //可以监听:给node_1添加子节点、删除子节点甚至node_1节点本身的创建和删除
        zkCliet.subscribeDataChanges("/node_1", new ZkChildChangeListener());
        Thread.sleep(Integer.MAX_VALUE);
    }
}

修改节点值:

输出:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值