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是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:**分布式锁服务**。由于ZooKeeper的开源特性,后来我们的开发者在分布式锁的基础上,摸索了出了其他的使用方法:**...
本文适合但不限于软件开发人员阅读。本文档能够使阅读者对zookeeper有一个宏观且全面的了解,内容主要包含zookeeper架构、数据模型、读写及工作原理、典型应用场景、指令汇总等,
这个只是其中一个版本的包,详细的可以在http://maven.outofmemory.cn/org.apache.zookeeper/zookeeper/里面找到更多的
zookeeper笔记.pdf
第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
1.ZooKeeper 是什么? 2.ZooKeeper 提供了什么? 3.Zookeeper 文件系统 4.四种类型的 znode 5.Zookeeper 通知机制 6.Zookeeper 做了什么? 7.zk 的命名服务(文件系统) 8.zk 的配置管理(文件系统、通知机制) 9....
自己整理的ZooKeeper学习笔记,适合刚刚接触ZooKeeper的人学习
java ZooKeeper学习笔记\ZooKeeper原理、运用
org.apache.zookeeper 3.4.6下载 org.apache.zookeeper 3.4.6 安全稳定的版本
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.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,包含添加系统服务插件及添加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是一个分布式的,开放源码的分布式应用程序协调...ZooKeeper代码版本中,提供了分布式独享锁、选举、队列的接口,代码在zookeeper-3.4.3\src\recipes。其中分布锁和队列有Java和C两个版本,选举只有Java版本。
zookeeper-3.4.6.tar,
Zookeeper源码分析.epub
zookeeper-3.4.10.tar.gz 安装包