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 - --------------

ZooKeeper 笔记(2) 监听数据变化的更多相关文章

  1. $scope.$watch()——监听数据变化

    $scope.$watch(watchFn, watchAction, [deepWatch]):监听数据变化,三个参数 --watchFn:监听的对象,一个带有Angular 表达式或者函数的字符串 ...

  2. vue.js之过滤器,自定义指令,自定义键盘信息以及监听数据变化

    一.监听数据变化 1.监听数据变化有两种,深度和浅度,形式如下: vm.$watch(name,fnCb); //浅度 vm.$watch(name,fnCb,{deep:true}); //深度监视 ...

  3. vue教程2-08 自定义键盘信息、监听数据变化vm.$watch

    vue教程2-08 自定义键盘信息 @keydown.up @keydown.enter @keydown.a/b/c.... 自定义键盘信息: Vue.directive('on').keyCode ...

  4. 关于微信小程序使用watch监听数据变化的方法

    众所周知,Vue中,可以使用监听属性 watch来观察和响应 Vue 实例上的数据变化,那么小程序能不能实现这一点呢? 监听器的原理,是将data中需监听的数据写在watch对象中,并给其提供一个方法 ...

  5. $watch监听数据变化和run方法

    angular中$watch方法可以监听数据的变化. $scope.$watch('phone',function(){ $scope.phone.fre = $scope.phone.num> ...

  6. mvc 缓存 sqlCacheDependency 监听数据变化

    mvc 缓存   对于MVC有Control缓存和Action缓存. 一.Control缓存 Control缓存即是把缓存应用到整个Control上,该Control下的所有Action都会被缓存起来 ...

  7. SQL Server CDC配合Kafka Connect监听数据变化

    写在前面 好久没更新Blog了,从CRUD Boy转型大数据开发,拉宽了不少的知识面,从今年年初开始筹备.组建.招兵买马,到现在稳定开搞中,期间踏过无数的火坑,也许除了这篇还很写上三四篇. 进入主题, ...

  8. 微信小程序实现watch属性监听数据变化

    Vue 提供了一种通用的方式来观察和响应 Vue 实例上的数据变动:监听属性 watch. 虽然watch的滥用会导致性能不佳,但在一些情况下我们还是需要watch,使得代码更加简洁.逻辑更加清晰(其 ...

  9. vue中监听数据变化 watch

    今天做项目的时候,子组件中数据(原本固定的数据)需要父组件动态传入,如果一开始初始化用到的数据.但当时还没有获取到,初始化结束就不会更新数据了.只有监听这两个属性,再重新执行初始化. 1.watch是 ...

随机推荐

  1. 学习 HTML5-页面结构(1)

    缘起 2014年10月29日,万维网联盟宣布,经过几乎8年的艰辛努力,HTML5标准规范终于最终制定完成了,并已公开发布. 而HTML5的草稿版本在13年就已经放出.作为一个有追求的程序猿这次想赶一次 ...

  2. JQuery+ajax+jsonp 跨域访问

    Jsonp(JSON with Padding)是资料格式 json 的一种“使用模式”,可以让网页从别的网域获取资料. 关于Jsonp更详细的资料请参考http://baike.baidu.com/ ...

  3. LB 简单比较 – F5、NetScaler、LVS、Nginx、Haproxy

    LB 简单比较 – F5.NetScaler.LVS.Nginx.Haproxy 负载均衡技术是构建大型网站必不可少的架构策略之一.它的目的是,把用户的请求分发到多台后端的设备上,用以均衡服务器的负载 ...

  4. HashSet、LinkedHashSet、TreeSet

    以下内容基于jdk1.7.0_79源码: 关于HashSet.LinkedHashSet.TreeSet Set接口的实现类,最大特点是不允许出现重复元素: HashSet:基于HashMap实现,一 ...

  5. (转)教你记住ASP.NET WebForm页面的生命周期

    对于ASP.NET Webform的开发者,理解ASP.NET Webform的页面生命周期是非常重要的.主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性.但是记忆和理解页面生命周期里提供 ...

  6. 0016 Java学习笔记-异常-如果try-catch-finally中都存在return语句会怎样?

    上午在搜索"System.runFinalization"的时候,搜到 http://www.cnblogs.com/Skyar/p/5962253.html ,其中有关于try- ...

  7. 【mysql】关于乐观锁

    一.乐观锁介绍 乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁假设认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检,乐观锁适用于 ...

  8. JavaScript动态显示当前时间

    JavaScript动态显示当前时间: 2016年01月04日  时间:16:58:32  星期一 <span id="timejs"></span> &l ...

  9. 地图编辑器V3

    V3.2.4 (2014-07-03) ---------------------------1. 保存地图的锁定与可视状态:2. 地图单独存为map格式结尾的文件与导出的XML文件区别:3. 修正瓷 ...

  10. height:100%不起作用(无效),div全屏

    当父容器是body时,height:100%不起作用(无效),解决办法:在css代码段中添加 html, body{ margin:0; height:100%; } 实现div全屏的时候需要上面那段 ...