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

  • 相关阅读:
    POJ 3259 Wormholes【BellmanFord】
    POJ 2960 SNim【SG函数的应用】
    ZOJ 3578 Matrixdp水题
    HDU 2897 邂逅明下【bash博弈】
    BellmanFord 算法及其优化【转】
    【转】几个Java的网络爬虫
    thinkphp 反字符 去标签 自动加点 去换行 截取字符串 冰糖
    php 二维数组转 json文本 (jquery datagrid 数据格式) 冰糖
    PHP 汉字转拼音(首拼音,所有拼音) 冰糖
    设为首页与加入收藏 兼容firefox 冰糖
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/4604864.html
Copyright © 2020-2023  润新知