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); } }
结果实例:
上一篇:
JS实现多线程数据分片下载
下一篇:
Swagger的详细使用教程