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. DOTA2参数收集

    -language schinese 显示中文界面(使用英文语音的同学使用) -perfectworld 登陆国服(Steam平台) -novid 不显示启动动画

  2. 在FlashDevelop里使用1.8版本的的TortoiseSVN

    前几天更新TortoiseSVN到1.8版本后发现FD(FlashDevelop)里不能使用svn了,在项目面板里的所有文件及文件夹都不能正确显示svn状态了,清一色都显示为未添加版本控制的状态图标, ...

  3. Windows下配置Git服务器和客户端 超全

    为了配合Redmine使用,特地用Git来做版本控制. Git Candy© 是一个基于ASP.NET MVC的Git分布式版本控制平台,Git Candy的目标是轻松干掉Bonobo,逐渐追赶Git ...

  4. 自定义底部工具栏及顶部工具栏和Fragment配合使用demo

    首先简单的介绍下fragment,fragment是android3.0新增的概念,其中文意思是碎片,它与activity非常相似,用来在一个activity中描述一些行为或一部分用户界面.使用锁个f ...

  5. 表单和iframe的使用

    图片热点: 规划出图片上的一个区域,可以做出超链接,直接点击图片区域就可以完成跳转的效果.示例: 网页划区: 在一个网页里,规划出一个区域用来展示另一个网页的内容.示例: 网页的拼接: 在一个网络页面 ...

  6. java.lang.UnsatisfiedLinkError: C:\apache-tomcat-8.0.21\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

    Tomcat启动报错: 25-Mar-2016 10:40:43.478 SEVERE [main] org.apache.catalina.startup.Catalina.stopServer C ...

  7. oracle学习笔记系列------oracle 基本操作之基本函数的用法

    --创建一个accout账户表 CREATE TABLE account( id ) NOT NULL, recommender_id ), login_name ) NOT NULL, login_ ...

  8. MarkDown插入图片

    MarkDown插入图片的语法 ·编辑器:MacDown 比如博客园的Logo,URL是 http://static.cnblogs.com/images/logo_small.gif 在要插入图片的 ...

  9. C#读写app.config中的数据

    C#读写app.config中的数据 读语句: String str = ConfigurationManager.AppSettings["DemoKey"]; 写语句: Con ...

  10. 单机搭建Android开发环境(一)

    老话,工欲善其事必先利其器.为了学习安卓系统开发,我下了血本,更换了电脑.俗语,磨刀不误砍柴工,好钢用在刀刃上,为了发挥新本的最大潜能,我花费了很长时间去做配置和优化,都感觉有点偏执了.不过,从到目前 ...