`
bit1129
  • 浏览: 1052630 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

[Zookeeper学习笔记之八]Zookeeper源代码分析之Zookeeper.ZKWatchManager

阅读更多

ClientWatchManager接口

//接口的唯一方法materialize用于确定那些Watcher需要被通知
//确定Watcher需要三方面的因素1.事件状态 2.事件类型 3.znode的path
public interface ClientWatchManager {
    /**
     * Return a set of watchers that should be notified of the event. The 
     * manager must not notify the watcher(s), however it will update it's 
     * internal structure as if the watches had triggered. The intent being 
     * that the callee is now responsible for notifying the watchers of the 
     * event, possibly at some later time.
     * 
     * @param state event state
     * @param type event type
     * @param path event path
     * @return may be empty set but must not be null
     */
    public Set<Watcher> materialize(Watcher.Event.KeeperState state,
        Watcher.Event.EventType type, String path);
}

 

 

 

   ZKWatchManager类

private static class ZKWatchManager implements ClientWatchManager {
        //znode数据更新Watcher     
        private final Map<String, Set<Watcher>> dataWatches =
            new HashMap<String, Set<Watcher>>();
        //znode存在Watcher,即使znode不存在,这个Watcher也可以设置到这个不存在的znode上
        private final Map<String, Set<Watcher>> existWatches =
            new HashMap<String, Set<Watcher>>();
       //znode的子znodes个数变化Watcher
       private final Map<String, Set<Watcher>> childWatches =
            new HashMap<String, Set<Watcher>>();
        //默认的Watcher,如果构造Zookeeper没有显式指定Watcher,则使用这个watcher
        private volatile Watcher defaultWatcher;

        //把from中的watcher添加到集合to中
        final private void addTo(Set<Watcher> from, Set<Watcher> to) {
            if (from != null) {
                to.addAll(from);
            }
        }

        /* (non-Javadoc)
         * @see org.apache.zookeeper.ClientWatchManager#materialize(Event.KeeperState, 
         *                                                        Event.EventType, java.lang.String)
         */
        @Override
        public Set<Watcher> materialize(Watcher.Event.KeeperState state,
                                        Watcher.Event.EventType type,
                                        String clientPath)
        {
            Set<Watcher> result = new HashSet<Watcher>();

            switch (type) {
            case None://事件类型为None,表示???,把dataWatches,existWatches,childWatches所有的watch都返回
                //添加默认的Watcher,只有在类型为None的情况下,才会添加这个默认的Watcher
                result.add(defaultWatcher);
                //满足两种情况则清空dataWatches,existWatches,childWatches
                //1.状态不是SyncConnected(客户端与服务器端已建立链接)
                //2.设置了System property:zookeepr.disableAutoWatchReset 为true
/*
zookeeper.disableAutoWatchReset用于控制是否启动Watch自动reset,Clients automatically reset watches during session reconnect
*/                      
                boolean clear = ClientCnxn.getDisableAutoResetWatch() &&
                        state != Watcher.Event.KeeperState.SyncConnected;

                synchronized(dataWatches) {
                    for(Set<Watcher> ws: dataWatches.values()) {
                        result.addAll(ws);
                    }
                    if (clear) {
                        dataWatches.clear();
                    }
                }

                synchronized(existWatches) {
                    for(Set<Watcher> ws: existWatches.values()) {
                        result.addAll(ws);
                    }
                    if (clear) {
                        existWatches.clear();
                    }
                }

                synchronized(childWatches) {
                    for(Set<Watcher> ws: childWatches.values()) {
                        result.addAll(ws);
                    }
                    if (clear) {
                        childWatches.clear();
                    }
                }

                return result;
            case NodeDataChanged://如果是单节点发生变化,znode数据变化,znode创建
            case NodeCreated:
                synchronized (dataWatches) {
                   //把clientPath从dataWatches删除掉,加入到result中
                    addTo(dataWatches.remove(clientPath), result);
                }
                synchronized (existWatches) {
                    addTo(existWatches.remove(clientPath), result);
                }
                break;
            case NodeChildrenChanged://子节点发生数目改变
                synchronized (childWatches) {
                    addTo(childWatches.remove(clientPath), result);
                }
                break;
            case NodeDeleted://删除节点
                synchronized (dataWatches) {
                    addTo(dataWatches.remove(clientPath), result);
                }
                // XXX This shouldn't be needed, but just in case
                synchronized (existWatches) {
                    Set<Watcher> list = existWatches.remove(clientPath);
                    if (list != null) {//list应该
                        addTo(existWatches.remove(clientPath), result);//只是将clientPath对应的existWatches删除掉,不会加入到result上
                        LOG.warn("We are triggering an exists watch for delete! Shouldn't happen!");
                    }
                }
                synchronized (childWatches) {//如果一个节点存在子节点,则这个子节点不能被删掉,所以,这地方的逻辑是否会有问题?
                    addTo(childWatches.remove(clientPath), result);
                }
                break;
            default:
                String msg = "Unhandled watch event type " + type
                    + " with state " + state + " on path " + clientPath;
                LOG.error(msg);
                throw new RuntimeException(msg);
            }

            return result;
        }
    }

 

 默认的Watcher只有事件类型为None的情况下才会设置上,事件类型为Nonde表示什么意思呢?研究了才来更新

 

分享到:
评论

相关推荐

    zookeeper学习笔记

    zookeeper学习笔记

    Zookeeper学习笔记.docx

    Zookeeper学习笔记

    Zookeeper学习笔记.pdf

    ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:**分布式锁服务**。由于ZooKeeper的开源特性,后来我们的开发者在分布式锁的基础上,摸索了出了其他的使用方法:**...

    zookeeper学习笔记.pptx

    本文适合但不限于软件开发人员阅读。本文档能够使阅读者对zookeeper有一个宏观且全面的了解,内容主要包含zookeeper架构、数据模型、读写及工作原理、典型应用场景、指令汇总等,

    org.apache.zookeeper/zookeeper的jar包

    这个只是其中一个版本的包,详细的可以在http://maven.outofmemory.cn/org.apache.zookeeper/zookeeper/里面找到更多的

    zookeeper笔记.pdf

    zookeeper笔记.pdf

    第6章 Zookeeper 2 6.1. Zookeeper入门 2 6.1.1. 概述 2 6.1.2. 特点 3 6.1.3

    第6章 Zookeeper 2 6.1. Zookeeper入门 2 6.1.1. 概述 2 6.1.2. 特点 3 6.1.3. 数据结构 4 6.1.4. 应用场景 4 6.1.5. 下载地址 6 6.2. Zookeeper安装 7 6.2.1. 本地模式安装部署 7 6.2.2. 配置参数解读 9 6.3. ...

    zookeeper-3.4.9.tar.gz

    zookeeper-3.4.9.tar.gz

    zookeeper面试专题.pdf

    1.ZooKeeper 是什么? 2.ZooKeeper 提供了什么? 3.Zookeeper 文件系统 4.四种类型的 znode 5.Zookeeper 通知机制 6.Zookeeper 做了什么? 7.zk 的命名服务(文件系统) 8.zk 的配置管理(文件系统、通知机制) 9....

    Zookeeper学习笔记

    自己整理的ZooKeeper学习笔记,适合刚刚接触ZooKeeper的人学习

    ZooKeeper学习笔记

    java ZooKeeper学习笔记\ZooKeeper原理、运用

    org.apache.zookeeper 3.4.6

    org.apache.zookeeper 3.4.6下载 org.apache.zookeeper 3.4.6 安全稳定的版本

    ZooKeeper笔记.pdf

    zookeeper笔记

    zookeeper-3.5.7.zip文件(分享给需要的同学)

    zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 zookeeper-3.5.7.zip文件 ...

    zookeeper-3.4.9.tar.gz+安装过程笔记.doc

    zookeeper.tar.gz包,及安装使用步骤:1、下载zookeeper.x.x.x.tar.gz,放到虚拟机上 2、解压 3、单机模式 a.在conf目录下,复制zoo_sample.cfg到当前文件夹下命名为zoo.cfg。zookeeper默认使用zoo.cfg配置文件 b....

    zookeeper-3.4.14.zip

    zookeeper-3.4.14,包含添加系统服务插件及添加bat. 1. zookeeper-3.4.14源包 2. commons-daemon-1.1.0-bin-windows.zip 插件 3. 配置好插件的zookeeper-3.4.14包,右键管理员权限执行zk-server-install.bat

    zookeeper-3.4.11.tar.gz

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调...ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。

    zookeeper-3.4.6.tar

    zookeeper-3.4.6.tar,

    Zookeeper源码分析.epub

    Zookeeper源码分析.epub

    zookeeper-3.4.10.tar.gz.zip

    zookeeper-3.4.10.tar.gz 安装包

Global site tag (gtag.js) - Google Analytics