zoukankan      html  css  js  c++  java
  • zookeeper ZkClient Api

     

    ZkClient


    ZkClient创建连接

    //连接地址,如果是集群都好分割,超时时间也可以不填,构造方法也有默认的超时时间
    String CONNECT_ADDR = "192.168.9.145:2181";
    ZkClient zkClient = new ZkClient(new ZkConnection(CONNECT_ADDR), 10000);

    ZkClient创建节点

    //连接地址,如果是集群都好分割,超时时间也可以不填,构造方法也有默认的超时时间
    String CONNECT_ADDR = "192.168.9.145:2181";
    ZkClient zkClient = new ZkClient(new ZkConnection(CONNECT_ADDR), 10000);
    
    //创建临时节点
    zkClient.createEphemeral("/test002");
    
    //创建临时节点,并赋值data
    //zkClient.createEphemeral("/test002","mytestZookeeper");
    
    //创建临时连续节点,默认为path名称加序号 0000000000,eg:testPath0000000001,testPath0000000002
    //zkClient.createEphemeralSequential("/testPath","mydata" );
    //zkClient.createEphemeralSequential("/testPath2","mydata" );
    //zkClient.createEphemeralSequential("/testPath3","mydata" );
    
    //此节点是持久的,可以支持递归的创建节点,但是不能递归赋值
    //zkc.createPersistent("/super01","mydata");
    //zkc.createPersistent("/super02/c1", true);
    
    //经过测试这个也是临时节点
    //zkClient.create("/test002","mydata", CreateMode.EPHEMERAL);
    
    
    //因为创建的是临时接,关闭连接节点就销毁,所以为了观察,模拟连接不断开。
    Thread.sleep(10000);
    //关闭连接
    zkClient.close();
    
    //命令行连接zkcli 输如 ls/ 可查看节点是否创建成功
    //[zk: localhost:2181(CONNECTED) 0] ls /
    //[cluster, controller_epoch, brokers, zookeeper, test002, admin, isr_change_notification, //dubbo, consumers, latest_producer_id_block, config]
    //通过命令行可以看出,临时节点test002创建成功

    zkClient节点删除

    //删除 /temp节点
    zkc.delete("/temp");
    //递归删除/super
    zkc.deleteRecursive("/super");

    zkClient节点写入数据

    zkc.writeData("/super/c1", "新内容");

    zkClient查询子节点

    List<String> list = zkc.getChildren("/super");
    for(String p : list){
    	System.out.println(p);
    	String rp = "/super/" + p;
    	String data = zkc.readData(rp);
    	System.out.println("节点为:" + rp + ",内容为: " + data);
    }
    //节点为:/super/c1,内容为: 新内容

    Example:

    public class ZkClientBase {
    
    	/** zookeeper地址 */
    	static final String CONNECT_ADDR = "192.168.1.31:2181,192.168.1.32:2181,192.168.1.33:2181";
    	/** session超时时间 */
    	static final int SESSION_OUTTIME = 10000;//ms
    	
    	
    	public static void main(String[] args) throws Exception {
    		ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), SESSION_OUTTIME);
    		//1. create and delete方法
    
    		zkc.createEphemeral("/temp");
    		zkc.createPersistent("/super/c1", true);
    		Thread.sleep(10000);
    		zkc.delete("/temp");
    		zkc.deleteRecursive("/super");
    		
    		//2. 设置path和data 并且读取子节点和每个节点的内容
    		zkc.createPersistent("/super", "1234");
    		zkc.createPersistent("/super/c1", "c1内容");
    		zkc.createPersistent("/super/c2", "c2内容");
    		List<String> list = zkc.getChildren("/super");
    		for(String p : list){
    			System.out.println(p);
    			String rp = "/super/" + p;
    			String data = zkc.readData(rp);
    			System.out.println("节点为:" + rp + ",内容为: " + data);
    		}
    		
    		//3. 更新和判断节点是否存在
    		zkc.writeData("/super/c1", "新内容");
    		System.out.println(zkc.readData("/super/c1").toString());
    		System.out.println(zkc.exists("/super/c1"));
    		
    //		4.递归删除/super内容
    		zkc.deleteRecursive("/super");
    	}
    }
    

    输出

    c1
    节点为:/super/c1,内容为: c1内容
    c2
    节点为:/super/c2,内容为: c2内容
    新内容
    true

    ZKClient Watch的使用

    我们发现,上述ZKClient里面并没有类似的watcher、watch参数,这也就是说我们开发人员无需关心反复注册watcher的问题,zkclient给我们提供了一套监听方式,我们可以使用监听节点的方式进行操作,剔除了繁琐的反复watcher操作、简化了代码的复杂程度

    subscribeChildChanges方法 订阅子节点变化

    参数1:path路径
    参数2:实现了IZKChildListener接口的类(如:实例化IZKClientListener类) 只需要重写其handleChildChanges(String parentPath, List currentChild)方法。其中

    parentPath 为监听节点全路径
    currentChilds为新的子节点列表
    IZKChildListener事件说明针对于下面三个事件触发:
    新增子节点
    减少子节点
    删除节点
    注意: 不监听节点内容的变化
    举例

    public class ZkClientWatcher1 {
    
    	/** zookeeper地址 */
    	static final String CONNECT_ADDR = "192.168.1.31:2181,192.168.1.32:2181,192.168.1.33:2181";
    	/** session超时时间 */
    	static final int SESSION_OUTTIME = 10000;//ms
    	
    	
    	public static void main(String[] args) throws Exception {
    		ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), SESSION_OUTTIME);
    		
    		//对父节点添加监听子节点变化。
    		zkc.subscribeChildChanges("/super", new IZkChildListener() {
    			@Override
    			public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
    				System.out.println("parentPath: " + parentPath);
    				System.out.println("currentChilds: " + currentChilds);
    			}
    		});
    		
    		Thread.sleep(3000);
    		
    		zkc.createPersistent("/super");
    		Thread.sleep(1000);
    		
    		zkc.createPersistent("/super" + "/" + "c1", "c1内容");
    		Thread.sleep(1000);
    		
    		zkc.createPersistent("/super" + "/" + "c2", "c2内容");
    		Thread.sleep(1000);		
    		
    		zkc.delete("/super/c2");
    		Thread.sleep(1000);	
    		
    		zkc.deleteRecursive("/super");
    		Thread.sleep(Integer.MAX_VALUE);
    		
    	}
    }

    输出

    parentPath: /super
    currentChilds: []
    parentPath: /super
    currentChilds: [c1]
    parentPath: /super
    currentChilds: [c1, c2]
    parentPath: /super
    currentChilds: [c1]
    parentPath: /super
    currentChilds: null
    parentPath: /super
    currentChilds: null
    

    subscribeDataChanges 订阅内容变化
    和前面的subscribeChildChanges类似

    参数1 路径
    参数2 IZkDataListener对象,重写handleDataDeleted(String path) 方法,可以得到删除节点的path 重写handleDataChange(String path, Object data)可以得到变更的节点和变更的内容
    举例

    public class ZkClientWatcher2 {
    
    	/** zookeeper地址 */
    	static final String CONNECT_ADDR = "192.168.1.31:2181,192.168.1.32:2181,192.168.1.33:2181";
    	/** session超时时间 */
    	static final int SESSION_OUTTIME = 10000;//ms
    	
    	
    	public static void main(String[] args) throws Exception {
    		ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), SESSION_OUTTIME);
    		
    		zkc.createPersistent("/super", "1234");
    		
    		//对父节点添加监听子节点变化。
    		zkc.subscribeDataChanges("/super", 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("/super", "456", -1);
    		Thread.sleep(1000);
    
    		zkc.delete("/super");
    		Thread.sleep(Integer.MAX_VALUE);
    	}
    }
    

    输出

    变更的节点为:/super, 变更内容为:456
    删除的节点为:/super
  • 相关阅读:
    发现IDEA两个超级好用的工具
    事务的传播属性
    Java 单元测试PowerMockito
    Spirng源码学习 第一天
    2021年 每日打卡
    Spring源码调试环境搭建成功
    practice
    学习进度表
    报数
    负二进制转换
  • 原文地址:https://www.cnblogs.com/liclBlog/p/15349521.html
Copyright © 2011-2022 走看看