Zookeeper监听节点/数据变化

监听节点变化

    监听器可以对不存在的目录进行监听 监听目录下子节点发生变化,可以接受到通知,携带数据有子节点列表 监听目录创建和删除本身也会被监听到
package com.lagou.zk.demo;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
import java.util.List;

public class Get_Child_Change {
          
   
    public static void main(String[] args) throws InterruptedException {
          
   
    
        //获取到zkClient对象
        ZkClient zkClient = new ZkClient("centos7-1:2181");

        //对指定目录监听(不存在目录:/lg-client)
        zkClient.subscribeChildChanges("/lg-client", new IZkChildListener() {
          
   
            //该方法是接受到通知之后的逻辑(即要做的操作)
            //第一个参数path是节点的路径,第二个参数childs是子节点的信息
            @Override
            public void handleChildChange(String path, List<String> childs) throws Exception {
          
   
                System.out.println("路径:"+path);
                System.out.println("子节点信息:"+childs);
            }
        });

        //创建节点
        zkClient.createPersistent("/lg-client");
        Thread.sleep(1000);
        //创建字节点
        zkClient.createPersistent("/lg-client/c1");
        Thread.sleep(1000);

        //删除节点
        zkClient.delete("/lg-client/c1");
        Thread.sleep(1000);
        zkClient.delete("/lg-client");
        Thread.sleep(Integer.MAX_VALUE);
    }
}

自定义序列化

在这里插入代码片

结果示例:

监听数据变化

注意:监听数据变化,必须自定义序列化类型,否则会报错!

package com.lagou.zk.demo;

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

public class Get_Data_Change {
          
   
    public static void main(String[] args) throws InterruptedException {
          
   
        //获取zk对象
        ZkClient zkClient = new ZkClient("centos7-1:2181");
        //设置自定义序列化类型
        zkClient.setZkSerializer(new ZkStrSerializer());
        
        //判断节点是否存在,不存在创建
        boolean exists = zkClient.exists("/lg-client");
        if (!exists){
          
   
            zkClient.createPersistent("/lg-client","123");
        }

        //注册监听器,节点数据改变的类型,接受通知后的处理逻辑定义
        zkClient.subscribeDataChanges("/lg-client", new IZkDataListener() {
          
   
            //第一个参数path:节点的路径 第二个参数data:改变之后的新的数据
            @Override
            public void handleDataChange(String path, Object data) throws Exception {
          
   
                System.out.println(path + "data is changed,,new data " + data);
            }
            //数据删除 ->节点删除
            @Override
            public void handleDataDeleted(String path) throws Exception {
          
   
                System.out.println(path + "is deleted!");
            }
        });

        //更新节点数据,删除节点,验证监听器是否正常运行
        Object o = zkClient.readData("/lg-client");
        System.out.println(o);

        zkClient.writeData("/lg-client","new data");
        Thread.sleep(1000);

        //删除节点
        zkClient.delete("/lg-client");
        Thread.sleep(Integer.MAX_VALUE);
    }
}

自定义序列化

package com.lagou.zk.demo;

import org.I0Itec.zkclient.exception.ZkMarshallingError;
import org.I0Itec.zkclient.serialize.ZkSerializer;

public class ZkStrSerializer implements ZkSerializer {
          
   

    //序列化方法  数据->byte[]
    @Override
    public byte[] serialize(Object o) throws ZkMarshallingError {
          
   
        return String.valueOf(o).getBytes();
    }

    //反序列化方法  byte[]->数据
    @Override
    public Object deserialize(byte[] bytes) throws ZkMarshallingError {
          
   
        return new String(bytes);
    }
}

结果实例:

经验分享 程序员 微信小程序 职场和发展