zoukankan      html  css  js  c++  java
  • ZKClient操作Zookeeper

    ZKClient在Zookeeper原生API基础上进行封装,简化了代码的复杂度。

    节点的创建和删除

    import org.I0Itec.zkclient.ZkClient;
    import org.I0Itec.zkclient.ZkConnection;
     
    public class ZkClientBase {
     
        static final String CONNECT_ADDR = "192.168.0.217:2181,192.168.0.218:2181,192.168.0.219:2181";
        static final int SESSION_TIMEOUT = 35000;//单位:ms 
        static final int CONNECTION_TIMEOUT=60000;//单位:ms
        
        public static void main(String[] args) throws Exception {
            
            ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), CONNECTION_TIMEOUT);
            //创建临时节点和持久节点(解决递归创建节点的问题) 
            zkc.createEphemeral("/ephemeral");
            zkc.createPersistent("/persistent/p_1", true);
            
            Thread.sleep(20000);//线程休眠20s
            
            //删除临时节点和持久节点(解决递归删除节点的问题)
            zkc.delete("/ephemeral");
            zkc.deleteRecursive("/persistent");
        }
    }

    run as --java application


    20s后

    子节点的创建和读取

    import java.util.List;
    import java.util.concurrent.TimeUnit;
    import org.I0Itec.zkclient.ZkClient;
    import org.I0Itec.zkclient.ZkConnection;
     
    public class ZkClientBase {
     
        static final String CONNECT_ADDR = "192.168.0.217:2181,192.168.0.218:2181,192.168.0.219:2181";
        static final int SESSION_TIMEOUT = 35000;//单位:ms 
        static final int CONNECTION_TIMEOUT=60000;//单位:ms
        
        public static void main(String[] args) throws Exception {
            ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), CONNECTION_TIMEOUT);
            
            zkc.createPersistent("/persistent", "persistent value");
            zkc.createPersistent("/persistent/p1", "p1 value");
            zkc.createPersistent("/persistent/p2", "p2 value");
            List<String> list = zkc.getChildren("/persistent");
            for(String key : list){
                String nodePath = "/persistent/" + key;
                String data = zkc.readData(nodePath);
                System.out.println("节点path为:" + nodePath + ",内容为: " + data);
            }
                
        }
    }

    Eclipse中console输出

    Eclipse中Zookeeper Explorer内容

    更新节点内容

    import org.I0Itec.zkclient.ZkClient;
    import org.I0Itec.zkclient.ZkConnection;
     
    public class ZkClientBase {
     
        static final String CONNECT_ADDR = "192.168.0.217:2181,192.168.0.218:2181,192.168.0.219:2181";
        static final int SESSION_TIMEOUT = 35000;//单位:ms 
        static final int CONNECTION_TIMEOUT=60000;//单位:ms
        
        public static void main(String[] args) throws Exception {
            
            ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), CONNECTION_TIMEOUT);
            
            zkc.createPersistent("/persistent", "persistent value");
            zkc.writeData("/persistent", "new persistent value");
            System.out.println(zkc.readData("/persistent"));
            System.out.println(zkc.exists("/persistent"));
            System.out.println(zkc.exists("/persistent1"));
                    
        }
    }

    Eclipse Console输出


    Eclipse中Zookeeper Explorer内容

    ZKClient解决了watcher需要反复注册的问题

    ZKClient提供了一套监听方式,使用监听节点的方式进行操作,避免了繁琐的反复watcher操作

    subscribeChildChanges实现IZkChildListener接口类,重写handleChildChange方法。IZkChildListener触发事件:子节点创建、子节点删除、节点自身创建、节点自身删除。

    import java.util.List;
    import org.I0Itec.zkclient.IZkChildListener;
    import org.I0Itec.zkclient.ZkClient;
    import org.I0Itec.zkclient.ZkConnection;
     
    public class ZkClientWatcher {
     
        static final String CONNECT_ADDR = "192.168.0.217:2181,192.168.0.218:2181,192.168.0.219:2181";
        static final int SESSION_TIMEOUT = 35000;//单位:ms 
        static final int CONNECTION_TIMEOUT=60000;//单位:ms 
        
        
        public static void main(String[] args) throws Exception {
            ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), CONNECTION_TIMEOUT);
            
            //父节点添加子节点监听,仅监听父节点及其子节点的创建、删除,不会监听父节点及其子节点数据的变化
            zkc.subscribeChildChanges("/persistent", new IZkChildListener() {
                @Override
                public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
                    System.out.println("parentPath: " + parentPath);
                    System.out.println("currentChilds: " + currentChilds);
                }
            });
            
            zkc.createPersistent("/persistent");
            Thread.sleep(1000);
            zkc.createPersistent("/persistent" + "/" + "p1", "p1 value");
            Thread.sleep(1000);
            zkc.createPersistent("/persistent" + "/" + "p2", "p2 value");
            Thread.sleep(1000);
            //修改p2节点的值
            zkc.writeData("/persistent" + "/" + "p2", "new p2 value");
            Thread.sleep(2000);
            
            zkc.delete("/persistent/p2");
            Thread.sleep(1000);
            zkc.deleteRecursive("/persistent");
            Thread.sleep(5000);//休眠5s等待handleChildChange处理完成
        }
    }

    Eclipse的console输出

    Eclipse中Zookeeper Explorer内容

    subscribeDataChanges实现IZkDataListener接口,重写handleDataDeleted方法处理节点的删除事件,重写handleDataChange方法处理节点的数据更新事件。

    import org.I0Itec.zkclient.IZkDataListener;
    import org.I0Itec.zkclient.ZkClient;
    import org.I0Itec.zkclient.ZkConnection;
     
    public class ZkClientWatcher {
     
        static final String CONNECT_ADDR = "192.168.0.217:2181,192.168.0.218:2181,192.168.0.219:2181";
        static final int SESSION_TIMEOUT = 35000;//单位:ms 
        static final int CONNECTION_TIMEOUT=60000;//单位:ms  
        
        public static void main(String[] args) throws Exception {
            ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), CONNECTION_TIMEOUT);
            
            zkc.createPersistent("/persistent", "persistent value");
            zkc.subscribeDataChanges("/persistent", new IZkDataListener() {
                //删除节点
                @Override
                public void handleDataDeleted(String path) throws Exception {
                    System.out.println("删除的节点为:" + path);
                }
                
                //节点数据发生变化
                @Override
                public void handleDataChange(String path, Object data) throws Exception {
                    System.out.println("变更的节点为:" + path + ", 变更内容为:" + data);
                }
            });
            
            Thread.sleep(3000);
            zkc.writeData("/persistent", "new persistent value", -1);
            Thread.sleep(1000);
            zkc.createPersistent("/persistent" + "/" + "p1", "p1 value");
            Thread.sleep(1000);
            zkc.createPersistent("/persistent" + "/" + "p2", "p2 value");
            Thread.sleep(1000);
            //修改p2节点的值
            zkc.writeData("/persistent" + "/" + "p2", "new p2 value");
            Thread.sleep(3000);
            
            zkc.deleteRecursive("/persistent");
            Thread.sleep(Integer.MAX_VALUE);
        }
    }

    Eclipse中console输出

    Eclipse中Zookeeper Explorer内容

  • 相关阅读:
    【NX二次开发】难点清单
    【NX二次开发】Block UI 目录
    Open C
    【NX二次开发】缝合片体例子UF_MODL_create_sew
    【NX二次开发】拉伸的偏置方向猜想与验证
    【NX二次开发】拉伸面、拉伸封闭曲线成片体UF_MODL_create_extrusion
    【NX二次开发】创建有界平面UF_MODL_create_bplane
    【VBA】一些判断
    【VBA】日期时间
    【VBA】单元格插入图片,单元格删除图片
  • 原文地址:https://www.cnblogs.com/cat520/p/9412798.html
Copyright © 2011-2022 走看看