Watcher机制(二)WatchManager

简介: 本文深入分析ZooKeeper中WatchManager类的源码,重点解析其如何通过watchTable和watch2Paths两个映射管理Watcher与节点路径的关联关系,涵盖addWatch、removeWatcher、triggerWatch等核心方法的同步机制与执行流程,揭示事件监听与触发的底层原理。

一、前言  前面已经分析了Watcher机制中的第一部分,即在org.apache.zookeeper下的相关类,接着来分析org.apache.zookeeper.server下的WatchManager类。二、WatchManager源码分析2.1 类的属性 

说明:WatcherManager类用于管理watchers和相应的触发器。watchTable表示从节点路径到watcher集合的映射,而watch2Paths则表示从watcher到所有节点路径集合的映射。2.2 核心方法分析1. size方法说明:可以看到size方法是同步的,因此在多线程环境下是安全的,其主要作用是获取watchTable的大小,即遍历watchTable的值集合。2. addWatch方法说明:addWatch方法同样是同步的,其大致流程如下  ① 通过传入的path(节点路径)从watchTable获取相应的watcher集合,进入②  ② 判断①中的watcher是否为空,若为空,则进入③,否则,进入④  ③ 新生成watcher集合,并将路径path和此集合添加至watchTable中,进入④【类似缓存操作】  ④ 将传入的watcher添加至watcher集合,即完成了path和watcher添加至watchTable的步骤,进入⑤  ⑤ 通过传入的watcher从watch2Paths中获取相应的path集合,进入⑥   ⑥ 判断path集合是否为空,若为空,则进入⑦,否则,进入⑧  ⑦ 新生成path集合,并将watcher和paths添加至watch2Paths中,进入⑧  ⑧ 将传入的path(节点路径)添加至path集合,即完成了path和watcher添加至watch2Paths的步骤。综上:addWatche方法会将:1.入参所对应的watcher添加到入参path所对应的全部Watcher集合中,如path下已有则添加,没有创建新的并添加进去;2.入参所对应的path添加到入参watcher所对应给的所有路径集合中,如watcher对应路径为空则创建新的集合进行添加,非空将入参path直接添加进去。3. removeWatcher方法  说明:removeWatcher用作从watch2Paths和watchTable中中移除该watcher,其大致步骤如下  ① 从watch2Paths中移除传入的watcher,并且返回该watcher对应的路径集合,进入②  ② 判断返回的路径集合是否为空,若为空,直接返回,否则,进入③  ③ 遍历②中的路径集合,对每个路径,都从watchTable中取出与该路径对应的watcher集合,进入④  ④ 若③中的watcher集合不为空,则从该集合中移除watcher,并判断移除元素后的集合大小是否为0,若为0,进入⑤  ⑤ 从watchTable中移除路径4. triggerWatch方法 说明:该方法主要用于触发watch事件,并对事件进行处理。其大致步骤如下  ① 根据事件类型、连接状态、节点路径创建WatchedEvent,进入②  ② 从watchTable中移除传入的path对应的键值对,并且返回path对应的watcher集合,进入③  ③ 判断watcher集合是否为空,若为空,则之后会返回null,否则,进入④  ④ 遍历②中的watcher集合,对每个watcher,从watch2Paths中取出path集合,进入⑤  ⑤ 判断④中的path集合是否为空,若不为空,则从集合中移除传入的path。进入⑥  ⑥ 再次遍历watcher集合,对每个watcher,若supress不为空并且包含了该watcher,则跳过,否则,进入⑦  ⑦ 调用watcher的process方法进行相应处理,之后返回watcher集合。【这里的process具体怎么执行的呢】5. dumpWatches方法

Java

运行代码复制代码public synchronized void removeWatcher(Watcher watcher) {

   // 从wach2Paths中移除watcher,并返回watcher对应的path集合

   HashSet<String> paths = watch2Paths.remove(watcher);

   if (paths == null) { // 集合为空,直接返回

       return;

   }

   for (String p : paths) { // 遍历路径集合

       // 从watcher表中根据路径取出相应的watcher集合

       HashSet<Watcher> list = watchTable.get(p);

       if (list != null) { // 若集合不为空

           // 从list中移除该watcher

           list.remove(watcher);

           if (list.size() == 0) { // 移除后list为空,则从watch表中移出

               watchTable.remove(p);

           }

       }

   }

}

public synchronized void dumpWatches(PrintWriter pwriter, boolean byPath) {

if (byPath) { // 控制写入watchTable或watch2Paths

for (Entry<String, HashSet<Watcher>> e : watchTable.entrySet()) { // 遍历每个键值对

// 写入键

pwriter.println(e.getKey());

for (Watcher w : e.getValue()) { // 遍历值(HashSet<Watcher>)

pwriter.print("\t0x");

pwriter.print(Long.toHexString(((ServerCnxn)w).getSessionId()));

pwriter.print("\n");

}

}

} else {

for (Entry<Watcher, HashSet<String>> e : watch2Paths.entrySet()) { // 遍历每个键值对

// 写入"0x"

pwriter.print("0x");

pwriter.println(Long.toHexString(((ServerCnxn)e.getKey()).getSessionId()));

for (String path : e.getValue()) { // 遍历值(HashSet<String>)

//

pwriter.print("\t");

pwriter.println(path);

}

}

}

}

  说明:dumpWatches用作将watchTable或watch2Paths写入磁盘。三、总结  WatchManager类用作管理watcher、其对应的路径以及触发器,其方法都是针对两个映射的操作。


相关文章
|
8月前
|
存储 关系型数据库 MySQL
微服务原理篇(XXLJOB-幂等-MySQL)
本文介绍了XXL-JOB任务调度的优势、组成结构及热点商品缓存更新任务的实现,涵盖幂等性概念与解决方案,并深入解析了MySQL存储引擎特性、索引失效场景、回表与覆盖索引原理以及SQL调优和分库分表策略。
364 0
微服务原理篇(XXLJOB-幂等-MySQL)
|
8月前
|
消息中间件 监控 NoSQL
海量数据下的订单超时取消
本文深入解析海量订单超时取消的分布式调度方案,对比Redis ZSet、延时消息、时间轮等技术优劣,结合大厂实践,提出分层架构与多级延迟策略,兼顾性能、可靠与可扩展性,助力构建高可用订单系统。
540 2
|
9月前
|
人工智能 自然语言处理 搜索推荐
文章“找茬”神器——媒体行业AI智能校对方案
年初DeepSeek大模型火爆以后,各行各业都在加速建设AI相关的场景,媒体行业无疑是大模型场景适配较好的一个行业。大模型凭借强大的内容生成能力,可以深度渗透内容生产的全链路环节,从热点事件的智能抓取、新闻稿件的快速生成,文章智能校对、个性化润色,大模型几乎可以重构传统内容生产流程。
871 15
|
8月前
|
运维 自然语言处理 监控
阿里云企业支持计划是什么?企业支持计划服务内容及常见问题解答
阿里云对企业有没有相关的支持或扶持计划?当然是有的,阿里云除基础售后支持外,针对业务系统复杂或对服务有更高要求的客户, 可选择阿里云提供的多种企业支持计划,获取工单极速响应、专属技术保障通道、技术服务经理 (TAM)等专属支持。本文为大家介绍阿里云企业支持计划是什么,介绍其服务内容,并解答一些常见问题。
1271 2
|
8月前
|
存储 弹性计算 安全
阿里云服务器2核4G收费标准和活动价格参考:u1实例2核4G5M199元,u2a实例504.60元起
现在租用阿里云服务器2核4G配置价格是多少?u1实例2核4G5M带宽有特惠,价格为199元1年,经济型e实例2核4G1M带宽活动价格为599.93元1年起,通用算力型u2a实例2核4G3M带宽的活动价格为648.60元1年,计算型c9a实例2核4G5M带宽活动价格为2938.22元1年起。本文为大家介绍阿里云服务器2核4G配置的实例规格收费标准与最新活动价格情况,以供参考。
1177 1
|
8月前
|
存储 人工智能 数据可视化
阿里云X米兰设计周:用AI创造,助力每一个创作者的想象力落地
阿里云作为第十届米兰设计周中国高校设计展AI技术首席合作伙伴,携手“云工开物”与PAI ArtLab平台,为师生提供专属算力、AIGC工具及学习资源,支持AI创作与模型训练,助力青年学子释放创意潜能,推动AI与设计深度融合。
|
8月前
|
人工智能 机器人 Java
黑马最新项目
AIGC项目涵盖大模型私有化部署、聊天机器人、RAG知识库及代码提示工具;天机AI集成SpringAI与多模型工作流;云岚到家聚焦微服务与分布式架构;四方保险构建统一支付与时序数据应用;星辰WMS与Dify项目即将发布。
438 0
黑马最新项目
|
8月前
|
canal 缓存 关系型数据库
微服务原理篇(Canal-Redis)
本文介绍了ES索引同步的常见方案,重点讲解Canal+MQ数据同步机制。通过解析MySQL的binlog日志,Canal模拟slave伪装接入主库,实现增量数据捕获,并结合RabbitMQ保证消息顺序性地同步至Elasticsearch。同时探讨了缓存一致性问题,提出使用分布式锁(如Redis)控制并发写操作,避免双写不一致。还涵盖Redis持久化、集群模式、过期淘汰策略及缓存三剑客(穿透、雪崩、击穿)的解决方案,系统梳理了高并发场景下的数据同步与缓存保障技术体系。
936 0
 微服务原理篇(Canal-Redis)
|
8月前
|
Java
Watcher机制(三)之ZooKeeper
本文深入分析ZooKeeper类的源码,涵盖其内部类、属性、构造函数及核心方法。重点解析Watcher机制中的注册流程,以及create、delete、exists等同步与异步操作的实现原理,揭示ZooKeeper客户端与服务端交互的核心逻辑。
277 0
|
8月前
|
人工智能 自然语言处理 API
全面认识MCP:大模型连接真实世界的“USB-C接口”
MCP(模型上下文协议)是Anthropic推出的开放标准,被誉为AI时代的“USB-C”。它统一了大模型与工具、数据源的连接方式,简化集成,提升安全与扩展性,推动AI智能体实现复杂任务自动化,正重塑全球AI应用生态。
1330 0

热门文章

最新文章