一、核心定位
WatchManager 是 Zookeeper 服务端的核心组件,位于 org.apache.zookeeper.server 包下,核心职责是 维护 Watcher 与节点路径的双向映射关系,并提供 Watcher 的添加、移除、事件触发等生命周期管理能力,确保事件发生时能精准通知到对应的 Watcher。
二、核心属性(双向映射设计)
WatchManager 通过两个 HashMap 实现双向映射,高效管理 Watcher 与节点路径的关联:
| 属性名 | 类型 | 核心作用 |
| watchTable | HashMap<String, HashSet<Watcher>> | 节点路径 → Watcher 集合映射:key 是节点路径(如 /test),value 是监听该路径的所有 Watcher 集合 |
| watch2Paths | HashMap<Watcher, HashSet<String>> | Watcher → 节点路径集合映射:key 是单个 Watcher 实例,value 是该 Watcher 监听的所有节点路径集合 |
三、核心方法(同步安全,多线程兼容)
所有核心方法均用 synchronized 修饰,保证多线程环境下的操作安全性,核心方法功能与流程如下:
1. size ():统计总 Watcher 数量
- 作用:计算当前所有节点路径上注册的 总 Watcher 数(去重,一个 Watcher 监听多个路径会被多次计数)。
- 逻辑:遍历
watchTable的所有 Value(Watcher 集合),累加每个集合的大小,返回总和。
2. addWatch (String path, Watcher watcher):注册 Watcher
- 作用:将 Watcher 与目标节点路径绑定,完成双向映射注册。
- 核心流程:
- 从
watchTable中获取该路径对应的 Watcher 集合;若集合为空,则新建 HashSet 并存入watchTable。 - 将传入的 Watcher 添加到该路径的 Watcher 集合中(完成 “路径→Watcher” 映射)。
- 从
watch2Paths中获取该 Watcher 对应的路径集合;若集合为空,则新建 HashSet 并存入watch2Paths。 - 将传入的路径添加到该 Watcher 的路径集合中(完成 “Watcher→路径” 映射)。
3. removeWatcher (Watcher watcher):移除 Watcher
- 作用:从所有关联的节点路径中移除指定 Watcher,清理双向映射。
- 核心流程:
- 从
watch2Paths中移除该 Watcher,获取其关联的所有节点路径集合。 - 若路径集合为空,直接返回;否则遍历每个路径。
- 对每个路径,从
watchTable中取出对应的 Watcher 集合,移除该 Watcher。 - 若移除后 Watcher 集合为空,从
watchTable中删除该路径(避免空集合占用内存)。
4. triggerWatch (...):触发 Watcher 事件(核心)
- 作用:节点路径发生对应事件时,触发关联的所有 Watcher 并执行回调逻辑。
- 核心流程:
- 根据事件类型(
EventType)、Zookeeper 状态(KeeperState)、节点路径,创建WatchedEvent事件对象。 - 从
watchTable中移除该路径对应的键值对,获取关联的所有 Watcher 集合(Watcher 默认一次性触发,触发后移除)。 - 若 Watcher 集合为空,返回 null;否则遍历每个 Watcher。
- 从
watch2Paths中取出该 Watcher 对应的路径集合,移除当前触发事件的路径。 - 若未被抑制(
supress不包含该 Watcher),调用 Watcher 的process(WatchedEvent event)方法,执行事件处理逻辑。 - 返回被触发的 Watcher 集合。
5. dumpWatches (...):持久化映射关系
- 作用:将
watchTable或watch2Paths的映射关系写入磁盘,用于日志记录或数据备份。
四、核心总结
- 设计核心:双向映射(路径→Watcher、Watcher→路径),兼顾 “按路径查 Watcher”(触发事件)和 “按 Watcher 查路径”(移除 Watcher)的高效性。
- 线程安全:所有核心方法均为同步方法(
synchronized),适配 Zookeeper 服务端多客户端连接的并发场景。 - 生命周期管理:通过
addWatch(注册)、removeWatcher(移除)、triggerWatch(触发)三个方法,完整覆盖 Watcher 从注册到销毁的全流程。 - 关键特性:Watcher 默认是 “一次性” 的,触发后会从
watchTable中移除,若需持续监听需重新注册。