博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ZooKeeper 笔记(2) 监听数据变化
阅读量:4577 次
发布时间:2019-06-08

本文共 2700 字,大约阅读时间需要 9 分钟。

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

 

转载于:https://www.cnblogs.com/yjmyzz/p/4604864.html

你可能感兴趣的文章
python整数作为条件_Python整数类型(int)详解
查看>>
pta简单实现x的n次方_c语言第二次作业pta..docx
查看>>
python导入规范_Python编程入门:如何规范的导入包和模块
查看>>
P2264 情书
查看>>
BZOJ 1004: [HNOI2008]Cards
查看>>
剪切板实现拖拽代码
查看>>
海量数据处理策略
查看>>
hello,world !
查看>>
【Entity Framework】Model First Approach
查看>>
C# DataTable删除行Delete与Remove的问题
查看>>
HDU2586How far away? LCA
查看>>
网络流 - 最大流
查看>>
随手记note(记事簿)
查看>>
JRE System Library 与Java EE Libraries的区别
查看>>
sqlite3性能优化要点
查看>>
颜色分类函数
查看>>
Oracle数据泵详解
查看>>
(中等) HDU 4725 The Shortest Path in Nya Graph,Dijkstra+加点。
查看>>
sort-归并排序
查看>>
django 快速实现完整登录系统(cookie)
查看>>