`
bit1129
  • 浏览: 1069998 次
  • 性别: 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学习笔记.doc”可能包含详细的理论介绍、操作步骤和案例分析;“zookeeper学习笔记.vsdx”可能是一个Visio图表,用于可视化Zookeeper的数据结构、工作流程或架构;而“zookeeper-...

    zookeeper笔记

    4. **源码阅读**:深入理解Zookeeper的工作原理,可以阅读其Java源代码,理解内部实现机制。 通过以上对Zookeeper的介绍,我们可以看到它在分布式系统中扮演着至关重要的角色。无论是作为初学者还是资深开发者,...

    Hadoop之HBase学习笔记

    【标签】"源码"提示我们,博主可能在笔记中深入到了HBase的源代码层面,分析了HBase的内部工作原理,比如RegionServer如何处理数据分布,HMaster的角色,以及HBase如何通过Zookeeper实现集群管理。"工具"则可能意味...

    ZooKeeper-:ZooKeeper源码剖析

    相反,只讲源代码就很难理解原理的全貌。本人尝试解释服务器从开始启动到正常提供其服务的代码逻辑,由于表述能力欠佳,且二进制中逻辑分支很多,所以文档中避免不了出现错误。如发现错误请提问题或私发 。

    《java学习》-SSM实战项目-Java高并发秒杀API,详细流程+学习笔记.zip

    本项目提供了详细的流程说明和学习笔记,帮助开发者更好地掌握相关知识。 首先,`pom.xml`文件是Maven项目的配置文件,它定义了项目依赖,包括SSM框架的各个版本和其他必要的库。通过管理依赖关系,Maven能够自动...

    Eclipse开发分布式商城系统+完整视频代码及文档

    │ 淘淘商城源代码.zip │ ├─01.第一天 │ 01.课程计划.avi │ 02.淘淘商城介绍.avi │ 03.创建后台工程-taotao-parent.avi │ 04.创建taotao-manager.avi │ 05.svn的使用.avi │ 06.ssm框架整合思路.avi │ 07....

    谷粒商城官方笔记.zip

    "资料源码下载地址.txt"可能提供了获取谷粒商城项目源代码的链接,这对于开发者来说是非常宝贵的资源,可以直接参考和学习实际项目中的代码实现。而"软件.zip"和"资料源码.zip"很可能是包含开发所需工具和项目源码的...

    PyPI 官网下载 | notebuild-1.1.21.tar.gz

    `notebuild`可能是一个用于构建或管理笔记应用的Python库,但具体的用途和功能需要查看其文档或者源代码才能得知。在实际使用前,用户需要先解压此文件,通常可以使用`tar -zxvf notebuild-1.1.21.tar.gz`命令,然后...

    PyPI 官网下载 | cauldron-notebook-1.0.8.tar.gz

    通常,一个Python库的`.tar.gz`格式文件包含了源代码、文档、测试用例和其他资源,便于用户在本地环境中安装和使用。 **Zookeeper 和分布式系统** 提到“zookeeper”,这通常与Apache ZooKeeper有关,这是一个...

    PyPI 官网下载 | dagstermill-0.8.6rc1.tar.gz

    这个压缩包通常包含了源代码、文档和其他必要的文件,以便用户在本地环境中构建和安装该库。 **dagstermill** Dagstermill是与Dagster相关的Python库,Dagster是一个强大的数据工程和机器学习工作流平台。...

    PyPI 官网下载 | mtpdocr-0.1.4.tar.gz

    通过研究其源代码和文档,开发者可以学习到如何构建一个与ZooKeeper集成的云原生Python库,以及如何利用OCR技术解决实际业务问题。无论是对于个人项目还是企业级应用,mtpdocr都可能成为一个强大的工具。

    大数据笔记kafka-jvm.zip

    《大数据笔记:深入理解Kafka...通过深入学习《大数据笔记:深入理解Kafka与JVM》,读者将不仅掌握Kafka的基本概念和操作,还能了解到JVM在大数据处理中的关键作用,为在实际工作中应对复杂的大数据挑战打下坚实基础。

    PyPI 官网下载 | notebook_splitter-1.5.tar.gz

    标题中的"PyPI 官网下载 | notebook_splitter-1.5.tar.gz"指的是Python的包索引(PyPI)上发布的名为`notebook_splitter`的软件包,版本为1.5,其源代码被压缩成tar.gz格式的文件供用户下载。PyPI是Python开发者分享...

    PyPI 官网下载 | wikipedia2vecsm-0.2.1.tar.gz

    通过PyPI下载的压缩包包含了所有必要的源代码和文档,用户可以方便地集成到自己的项目中,利用其进行各种NLP任务的建模和分析。同时,该库的潜力也在于其在云原生环境下的应用,尤其是在分布式计算场景下,能够处理...

    Hadoop深入浅出分享资料

    最后,"如何把hadoop源码关联到eclipse工程中"是针对开发者的内容,说明如何将Hadoop的源代码导入Eclipse这样的集成开发环境,以便于学习、调试或修改Hadoop源码。这通常涉及到克隆Hadoop仓库,配置构建工具如Maven...

    hadoop视频教程珍藏版

    源码解析部分则针对对Hadoop内部机制感兴趣的开发者,深入剖析Hadoop的源代码,帮助理解其设计思想和实现细节。这部分内容可能涉及Hadoop模块的分解,如HDFS的Block、NameNode和DataNode,以及MapReduce的JobTracker...

    大规模分布式系统架构与设计实战笔记8

    "源码"标签表明这篇笔记深入解析了源代码层面的知识,强调了通过阅读和理解开源工具的实现来提升技能的重要性。例如,开发者可能会学习如何利用Hadoop、Spark等大数据处理框架,或者Docker、Kubernetes等容器化和...

    大数据架构技术-吉首大学资料分享.zip

    它提供了笔记本风格的工作环境,便于数据科学家和分析师编写、运行和分享代码,实现快速的数据探索和洞察。 以上知识点构成了大数据处理的基础框架,通过学习和实践,可以有效提升对大数据架构的理解和应用能力。...

    hadoop源码归档.zip

    压缩包内的文件主要是法律学习资料,如法考笔记、刑法和民诉的思维导图、讲义等,而不是与Hadoop相关的源代码或IT技术文档。因此,我无法根据这些信息生成关于Hadoop的知识点。 如果您的目标是获取Hadoop的相关知识...

    使用SpringBoot开发的基于HBASE的大数据存储分布式云计算笔记(后端).zip

    SpringBoot简化了Spring应用的初始搭建以及开发过程,它集成了大量常用的第三方库配置,如数据源、JPA、MVC等,开发者可以“开箱即用”。在创建项目时,我们可以选择Spring Initializr来快速生成基础项目结构,包括...

Global site tag (gtag.js) - Google Analytics