zoukankan      html  css  js  c++  java
  • ZooKeeper(3.4.5) 使用Curator监听事件

    转载:http://www.mamicode.com/info-detail-494364.html

    标签:

    ZooKeeper原生的API支持通过注册Watcher来进行事件监听,但是Watcher通知是一次性的,因此开发过程中需要反复注册Watcher,比较繁琐。Curator引入了Cache来监听ZooKeeper服务端的事件。Cache对ZooKeeper事件监听进行了封装,能够自动处理反复注册监听,简化了ZooKeeper原生API繁琐的开发过程。

    简单的示例:

    package com.huey.dream.demo;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    import org.apache.curator.framework.CuratorFramework;
    import org.apache.curator.framework.CuratorFrameworkFactory;
    import org.apache.curator.framework.recipes.cache.NodeCache;
    import org.apache.curator.framework.recipes.cache.NodeCacheListener;
    import org.apache.curator.framework.recipes.cache.PathChildrenCache;
    import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
    import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
    import org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode;
    import org.apache.curator.retry.ExponentialBackoffRetry;
    
    /**
     * Curator事件监听
     * @author  huey
     * @version 1.0 
     * @created 2015-3-2
     */
    public class CarutorDemo {
    
        public static void main(String[] args) throws Exception {
            CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("192.168.1.109:2181")
                .sessionTimeoutMs(5000)
                .connectionTimeoutMs(3000)
                .retryPolicy(new ExponentialBackoffRetry(1000, 3))
                .build();
            client.start();
            
            client.create()
                .creatingParentsIfNeeded()
                .forPath("/zk-huey/cnode", "hello".getBytes());
            
            /**
             * 在注册监听器的时候,如果传入此参数,当事件触发时,逻辑由线程池处理
             */
            ExecutorService pool = Executors.newFixedThreadPool(2);
            
            /**
             * 监听数据节点的变化情况
             */
            final NodeCache nodeCache = new NodeCache(client, "/zk-huey/cnode", false);
            nodeCache.start(true);
            nodeCache.getListenable().addListener(
                new NodeCacheListener() {
                    @Override
                    public void nodeChanged() throws Exception {
                        System.out.println("Node data is changed, new data: " + 
                            new String(nodeCache.getCurrentData().getData()));
                    }
                }, 
                pool
            );
            
            /**
             * 监听子节点的变化情况
             */
            final PathChildrenCache childrenCache = new PathChildrenCache(client, "/zk-huey", true);
            childrenCache.start(StartMode.POST_INITIALIZED_EVENT);
            childrenCache.getListenable().addListener(
                new PathChildrenCacheListener() {
                    @Override
                    public void childEvent(CuratorFramework client, PathChildrenCacheEvent event)
                            throws Exception {
                            switch (event.getType()) {
                            case CHILD_ADDED:
                                System.out.println("CHILD_ADDED: " + event.getData().getPath());
                                break;
                            case CHILD_REMOVED:
                                System.out.println("CHILD_REMOVED: " + event.getData().getPath());
                                break;
                            case CHILD_UPDATED:
                                System.out.println("CHILD_UPDATED: " + event.getData().getPath());
                                break;
                            default:
                                break;
                        }
                    }
                },
                pool
            );
            
            client.setData().forPath("/zk-huey/cnode", "world".getBytes());
            
            Thread.sleep(10 * 1000);
            pool.shutdown();
            client.close();
        }
    }
  • 相关阅读:
    Spring Freamwork 开发初体验
    mybooklist.cn 书单de故事六月十六日
    mybooklist 日志5.12
    我的书单mybooklist
    Bison
    Java学习日记——基础篇(一)常识
    Python学习日记(十)—— 杂货铺(全局变量补充、Python参数传递、字符串格式化、迭代器、生成器)
    Python学习日记(九)—— 模块二(logging、json&pickle、xml、requests、configparser、shutil、subprocess)
    Python学习日记(八)—— 模块一(sys、os、hashlib、random、time、RE)
    Python学习日记(七)——装饰器
  • 原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/5729076.html
Copyright © 2011-2022 走看看