zoukankan      html  css  js  c++  java
  • 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 - --------------

  • 相关阅读:
    本站将进行有关《大道至简》的讨论~
    启动一个Rich Web Client的项目:Qomo OpenProject
    JavaScript面向对象的支持(1)
    从基础开始:Qomo OpenProject中的一些关键词(2)
    代码规范性与品质问题~
    任何想法的致命问题,并不在于没有实施条件,而在于根本不被实施
    再谈borland与MS对BUG的不同态度~
    善于使用资源的程序员才是好程序员
    伴随开发人员成长的问题:工程重要,还是算法重要?细节重要,还是架构重要?
    JavaScript面向对象的支持(2)
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/4604864.html
Copyright © 2011-2022 走看看