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的详细使用教程
