Distributed-zookeeper-ZkClient工具包

必看:https://www.cnblogs.com/shay-zhangjin/p/7781017.html

工具类

package com.everyday.helloworld.zoo;

import java.util.List;

import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.serialize.SerializableSerializer;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;

public class ZkClientUtil {

    private static final String zkServers = "192.168.198.100:2181";
    private static final int sessionTimeout = 5000;
    private static final int connectionTimeout = 5000;

    /**
     * 1)和zookeeper原生API不同,通过zkclient API创建会话,需要提供session timout, connection timeout两个定时器
     * 2)同时要提供1个序列化器实例,原因在于后续创建znode节点时,写入的数据(java对象)会自动通过序列化器来转换为byte[]
     * 3)同理,读取出的byte[]的数据,也会自动通过序列化器直接转换为Java对象
     */
    //    创建znode节点
    public static ZkClient createClient() {
        ZkClient zkClient = new ZkClient(zkServers, sessionTimeout, connectionTimeout, new SerializableSerializer());
        System.out.println("ZkClientUtil: ZkClient Connection OK!");
        return zkClient;
    }

    public static String createZnode(ZkClient zkClient, Object obj) {
        //直接将实例obj写入,自动通过序列化为byte[]
        String nodePath = zkClient.create("/node_zkclient", obj, CreateMode.PERSISTENT);

        System.out.println("ZkClientUtil: Create path is: " + nodePath);
        return nodePath;
    }

    //    修改节点数据
    public static void updateZnode(ZkClient zkClient, String nodePath, Object obj) {
        //直接写入实例,自动通过连接创建时创建的序列化实例,转换为byte[]
        System.out.println("ZkClientUtil: updateZnode begin obj=" + obj);
        zkClient.writeData(nodePath, obj);
    }

    //    获取节点数据
    public static Object getZnodeData(ZkClient zkClient, String nodePath) {
        Stat stat = new Stat();
        Object obj = zkClient.readData(nodePath, stat);

        if (obj == null) {
            System.out.println("ZkClientUtil: getZnodeData ,Node doesn't exist!");
            return null;
        } else {
            return obj;
        }
    }

    //    获取子节点列表
    public static void getZnodeChildren(ZkClient zkClient, String nodePath) {
        List<String> children_list = zkClient.getChildren(nodePath);
        //打印子节点列表
        System.out.println("Children list of /node_zkclient is : " + children_list.toString());
    }

    //    删除节点
    public static void delZnode(ZkClient zkClient, String nodePath) {
        //delete node without children
//        boolean e1 = zkClient.delete(nodePath);
//        System.out.println("Delete node without children: " + e1);

        // delete node and all children
        boolean e2 = zkClient.deleteRecursive(nodePath);
        System.out.println("Delete node and children: " + e2);
    }

    // 判断节点是否存在
    public static boolean isZnodeExist(ZkClient zkClient, String nodePath) {
        boolean exist = zkClient.exists(nodePath);
        System.out.println("Node exist status is: " + exist);
        return exist;
    }

    //    订阅子节点列表发生变化
    public static void subscribeChildChanges(ZkClient zkClient, String nodePath) {
        // subscribe children change event, multiple subscribe
        List<String> results = zkClient.subscribeChildChanges(nodePath, new ZkChildListener());

        System.out.println("ZkClientUtil: results=" + results);

        // sleep until receive event notify
        try {
            Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
package com.everyday.helloworld.zoo;

import java.util.List;

import org.I0Itec.zkclient.IZkChildListener;


public class ZkChildListener implements IZkChildListener {
    @Override
    public void handleChildChange(String parentZnodePath, List<String> list) throws Exception {
        //print parent path
        System.out.println("ZkChildListener parentZnodePath: " + parentZnodePath);
        //print current children
        System.out.println("ZkChildListener Current children: " + list.toString());
    }
}

猜你喜欢

转载自blog.csdn.net/yulong1026/article/details/80902963