ZooKeeper 笔记(2) 监听数据变化
ZK中的每个节点都可以存储一些轻量级的数据,这些数据的变化会同步到集群中的其它机器。在应用中程序员可以添加watcher来监听这些数据的变化,watcher只会触发一次,所以触发过后想要继续监听,必须再手动设置监听,这比较麻烦,好在ZkClient已经做了一些增强,在watcher的基础上,封装了所谓的Listener,开发人员只需要订阅Listener即可。
package yjmyzz.test;
import com.cnblogs.yjmyzz.domain.BaseBean;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.util.concurrent.TimeUnit;
public class ZKTest extends BaseBean {
private ZkClient zk;
private String nodeName = "/myApp";
@Before
public void initTest() {
super.setLoggerClass(this.getClass());
zk = new ZkClient("localhost:2181,localhost:2182,localhost:2183");
}
@After
public void dispose() {
zk.close();
logger.info("zkclient closed!");
}
@Test
public void testListener() throws InterruptedException {
//监听指定节点的数据变化
zk.subscribeDataChanges(nodeName, new IZkDataListener() {
@Override
public void handleDataChange(String s, Object o) throws Exception {
logger.info("node data changed!");
logger.info("node=>" + s);
logger.info("data=>" + o);
logger.info("--------------");
}
@Override
public void handleDataDeleted(String s) throws Exception {
logger.info("node data deleted!");
logger.info("s=>" + s);
logger.info("--------------");
}
});
logger.info("ready!");
//junit测试时,防止线程退出
while (true) {
TimeUnit.SECONDS.sleep(5);
}
}
@Test
public void testUpdateConfig() throws InterruptedException {
if (!zk.exists(nodeName)) {
zk.createPersistent(nodeName);
}
zk.writeData(nodeName, "1");
zk.writeData(nodeName, "2");
zk.delete(nodeName);
zk.delete(nodeName);//删除一个不存在的node,并不会报错
}
}
上面的代码中,演示了如何监听/myApp的数据变化,用junit做单元测试时,步骤如下:
1. 先测试testListener()方法,由于这个方法最后,写了一个死循环,所以程序不会退出。
2. 紧接着再测试testUpdateConfig(),这个方法中修改了节点的数据。
此时,由于testListener中设置了监听,所以监听程序应该会起作用,打印出相应的数据变化,类似下面的效果:
yjmyzz.test.ZKTest - ready! yjmyzz.test.ZKTest - node data changed! yjmyzz.test.ZKTest - node=>/myApp yjmyzz.test.ZKTest - data=>1 yjmyzz.test.ZKTest - -------------- yjmyzz.test.ZKTest - node data changed! yjmyzz.test.ZKTest - node=>/myApp yjmyzz.test.ZKTest - data=>2 yjmyzz.test.ZKTest - -------------- yjmyzz.test.ZKTest - node data deleted! yjmyzz.test.ZKTest - s=>/myApp yjmyzz.test.ZKTest - -------------- yjmyzz.test.ZKTest - node data deleted! yjmyzz.test.ZKTest - s=>/myApp yjmyzz.test.ZKTest - --------------
- 编程的智慧特点
- 【机器学习】机器学习大白话
- 回归分析技术|机器学习
- 用PHP蜘蛛做旅游数据分析
- 一秒找出用时间和随机数生成的上传文件名
- Java之集合的遍历与迭代器
- Java之字符串String,StringBuffer,StringBuilder
- JavaScript深入浅出补充——(一)数据类型,表达式和运算符
- Oracle数据库(一)概述、基础与简单操作
- Oracle数据库(二)常用关键字以及函数
- Oracle数据库(三)表操作,连接查询,分页
- 正式学习第一天下午——基础标签及其属性
- 正式学习第二天上午——常用标签及列表 0605
- Java之面向对象例子(三) 多态,重写,重载,equals()方法和toString()方法的重写
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JavaScript进阶教程(6)—硬核动图让你轻松弄懂递归与深浅拷贝
- Spring:JDBC Template,声明式事务
- Spring:讲解编程题
- SpringMVC:基本应用
- SpringMVC:进阶
- SpringMVC:SSM 整合
- 12 | Tornado源码分析:BaseIOStream 对象(上)
- 数据一致性校验及数据同步,运维必看
- Windows使用scoop包管理器安装RabbitMQ
- 深入理解web协议(二):DNS、WebSocket
- Elasticsearch:使用 function_score 及 soft_score 定制搜索结果的分数
- Elasticsearch:基于 Vector 的打分
- RocketMQ的发送模式和消费模式
- 实现一个简单的JS效果
- 1000000 / 60S 的 RocketMQ 不停机,扩容,平滑升级!