Spring监听器(ApplicationEvent):比MQ更轻的异步神器!

“顾客挤爆柜台时,优秀的店长不会催促咖啡师加速,而是启动一套科学的协作机制—— 就像Spring事件驱动,用发布-订阅模式让系统像顶级咖啡团队般优雅应对洪峰流量”

01

咖啡店里的监听器:3位灵魂角色

真实战场还原(每秒1000订单的咖啡店):

publicclassOrderEventextendsApplicationEvent{ // final修饰的订单ID:就像咖啡师绝不涂改的订单小票 privatefinal String orderId; // 创建时间:记录订单诞生时刻(线程安全不可变) privatefinal LocalDateTime createTime = LocalDateTime.now(); // 无setter:防止多线程并发篡改订单 }
@Service publicclassOrderService{ // 店长的麦克风(构造器注入更优雅) privatefinal ApplicationEventPublisher eventPublisher; publicvoidcreateOrder(Order order){ // 核心业务:生成订单(咖啡店接单) eventPublisher.publishEvent(new OrderEvent(this, order.getId())); // 📢 广播订单 } }
@Component publicclassCoffeeMakerListener{ @EventListener @Order(1) // 优先级:先做咖啡再推荐甜点 publicvoidmakeCoffee(OrderEvent event){ // 专注做咖啡,不关心谁结账 log.info("咖啡师:开始制作订单{}的拿铁...", event.getOrderId()); } }
  1. 事件定义:咖啡店的「订单小票」

  2. 事件发布:店长的「广播系统」

  3. 事件监听:咖啡团队的「技能响应」

02

扛住亿级流量的3把利器

场景1:冷启动缓存预加载(防雪崩)

@Component publicclassCachePreloader{ // 在Spring容器"开店准备完成"时触发 @EventListener(ContextRefreshedEvent.class) publicvoidinitCache() { // 异步加载省时30%(实测数据) CompletableFuture.runAsync(() -> { provinceService.loadProvincesToCache(); productService.preloadHotProducts(); }); } }

场景2:事务成功后的缓存清理(保一致性)

// 只在数据库提交成功后执行(避免脏清理) @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) publicvoidcleanCache(OrderUpdateEvent event){ // 异步清理:不阻塞结账队伍 redisTemplate.executeAsync(new RedisCallback<>() { @Override public Void doInRedis(RedisConnection connection){ connection.del(("order:" + event.getId()).getBytes()); returnnull; } }); }

场景3:无侵入式功能扩展

改造前(臃肿的收银台):

publicvoidpay(){ paymentService.pay(); // 核心支付 auditService.log(); // 审计代码入侵 riskService.check(); // 风控代码耦合 marketingService.addPoints(); // 新增需求污染核心 }

事件驱动改造后:

// 纯净支付核心(专注收钱) publicvoidpay(Long orderId){ paymentService.process(orderId); eventPublisher.publishEvent(new PaymentSuccessEvent(orderId)); // 📢 广播支付成功 } // 新增积分模块(无需修改支付代码) @Component publicclassPointListener{ @EventListener publicvoidaddPoints(PaymentSuccessEvent event){ // 积分服务独立演进 pointService.award(event.getOrderId(), 100); } }

03

血泪教训:3个深夜加班事故

事故1:多线程篡改事件(订单混乱)

// 错误!事件必须是只读的 @EventListener publicvoidhandle(OrderEvent event){ event.setStatus("MODIFIED"); // ⚠️ 多线程并发修改引发订单错乱 }

正确做法: 事件类设计为final字段 + 无setter

事故2:异步事件丢失(顾客投诉)

@SpringBootApplication @EnableAsync// 必须显式开启异步 publicclassApplication{ @Bean("eventExecutor") public Executor taskExecutor(){ // 关键参数:拒绝策略用CallerRunsPolicy(避免丢单) ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); return executor; } } // 指定线程池执行 @Async("eventExecutor") @EventListener publicvoidasyncHandle(OrderEvent event){...}

事故3:事件循环调用(咖啡师卡死)

// 错误:在事件处理中发布新事件 @EventListener publicvoidhandleA(EventA a){ publisher.publishEvent(new EventB()); } @EventListener publicvoidhandleB(EventB b){ publisher.publishEvent(new EventA()); // ♻️ 死循环! }

04

关键抉择:监听器 vs MQ 架构对垒

维度

Spring监听器

MQ消息队列

适用场景

单机事务协作 ✅

跨服务通信 ✅

可靠性

进程宕机事件消失 ❌

持久化/重试 ✅

吞吐量

内存级传输,10w+/s 🚀

受网络限制,1w/s ⚠️

开发效率

免搭建MQ,注解即用 ✅

需部署中间件 ❌

数据一致性

本地事务保障 ✅

需分布式事务 ⚠️

黄金决策树:

同JVM事务操作 → Spring监听器(开发效率王炸)

跨服务最终一致 → RocketMQ(可靠性担当)

05

性能调优:监听器的涡轮增压

异步喷射:

@Async// 方法级异步(线程池加速) @EventListener publicvoidasyncProcess(LogEvent event){...}

条件过滤(减少无效处理):

// 只处理VIP客户的订单 @EventListener(condition = "#event.user.level == 'VIP'") publicvoidhandleVipOrder(OrderEvent event){...}

批量处理(Spring 4.2+特性):

// 一次性处理整批订单(提升数据库IO效率) @EventListener publicvoidbatchProcess(List<OrderEvent> events){ orderDao.batchInsert(events.stream().map(OrderConverter::toEntity).toList()); }

06

最佳实践:5条生存法则

1、单一职责原则

一个监听器只做一件事:如 PaymentListener 只处理支付, CouponListener 只发券

2、事件轻量化

禁止在事件中携带 HttpSession 等重型对象(建议只传ID)

3、异常隔离舱

异步事件必须独立捕获异常:

@Async @EventListener publicvoidhandle(Event event){ try { businessLogic(); } catch (Exception e) { // 记录日志 + 告警(防止雪崩) log.error("事件处理失败: {}", event, e); alarmManager.notify(e); } }

4、版本兼容设计

事件类预留版本字段:

publicclassOrderEvent{ privatefinal String version = "1.0"; // 未来可扩展 }
// 监控处理时长/失败率/QPS @Around("@annotation(org.springframework.context.event.EventListener)") public Object monitor(ProceedingJoinPoint pjp){ Timer.Sample sample = Timer.start(); try { return pjp.proceed(); } finally { sample.stop(Metrics.timer("event.process.time")); } }

5、监控三件套

优秀架构的本质不是预测所有需求,而是拥抱变化。

通过Spring事件监听器,我们将系统拆解为可插拔的乐高模块:

  • 新增功能时 → 添加监听器(无需修改核心代码)

  • 流量暴增时 → 开启异步(无需重构架构)

这恰如经营咖啡店的真谛:

“不是雇佣更快的咖啡师,而是设计永不拥堵的协作机制”

程序员彩蛋:

下回当你为需求变更焦头烂额时,不妨问问自己:

“我的代码,像一家应对自如的咖啡店吗?”

附录:性能压测数据(阿里云ECS 8核16G)

模式

吞吐量

平均延迟

CPU占用

同步监听

12,000/s

15ms

85%

异步+批量

98,000/s

2ms

62%

技术选型建议: 万级QPS以内首选Spring事件,超越则上MQ

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1200317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超级好用的仿真计算,输入参数即可。 cruise与simulink联合仿真计算,一个模型解决纯...

超级好用的仿真计算&#xff0c;输入参数即可。 cruise与simulink联合仿真计算&#xff0c;一个模型解决纯电两驱动力性经济性计算&#xff0c;根据国标工况载荷&#xff0c;汽车公告测试工况&#xff0c;考虑电池峰值放电时间&#xff0c;放电功率特性&#xff0c;电机峰值扭矩…

2026最新幼小衔接幼儿园top5评测!服务深度覆盖锦江区、青羊区、双流区等地,辐射成都本地,优质培训学校权威榜单发布,助力儿童平稳过渡小学

随着幼小衔接成为家长关注的焦点,选择专业机构帮助孩子做好入学准备至关重要。本榜单基于课程体系科学性、师资专业度、家校共育效能、区域覆盖能力四大维度,结合成都本地家长口碑与行业评测数据,权威解析2026年成都…

山东服务不错的不锈钢液压设备接头品牌厂家,哪家比较靠谱?

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家军工级不锈钢液压接头标杆企业,为工业企业选型提供客观依据,助力精准匹配适配的液压连接服务伙伴。 TOP1 推荐:河北万熙顺液压科技有限公司 推荐指数:★★…

AuNRs-mPEG5000(808nm,甲氧基聚乙二醇修饰金纳米棒,应用特性

AuNRs-mPEG5000&#xff08;808nm&#xff0c;甲氧基聚乙二醇修饰金纳米棒&#xff0c;应用特性AuNRs-mPEG5000&#xff08;808 nm&#xff09;是一类表面功能化的金纳米棒&#xff08;Gold Nanorods, AuNRs&#xff09;纳米材料&#xff0c;常用于生物成像、光热治疗&#xff…

2026年优质工单系统软件、靠谱品牌与资深厂商推荐清单

在数字化转型深化的2026年,工单系统已成为企业打通服务链路、提升协同效率的核心工具,广泛覆盖零售、制造、教育等多领域。随着企业对服务时效、数据安全及跨场景适配需求的升级,市场上工单系统呈现“轻量化与全功能…

biotin-N3,biotin-azide ,N3-biotin,biotin-PEG-N3,生物素偶联叠氮基

biotin-N3&#xff0c;biotin-azide &#xff0c;N3-biotin&#xff0c;biotin-PEG-N3&#xff0c;生物素偶联叠氮基Biotin-N3 是一种功能性化学试剂&#xff0c;由生物素&#xff08;Biotin&#xff09;和叠氮基&#xff08;Azide, –N₃&#xff09;连接而成&#xff0c;属…

2026年1月最新湖北麻城口碑好的石材厂家推荐

在建筑与市政工程领域,石材以其天然质感、卓越的耐久性和独特的装饰效果,始终占据着重要地位。随着市场对高品质、高效率、高性价比的石材需求日益增长,如何甄选可靠、专业的石材供货商,已成为工程项目成功与否的关…

宕机后,Redis如何实现快速恢复?

Redis作为非常火热的内存数据库,其除了具有非常高的性能之外,还需要保证高可用,在故障发生时,尽可能地降低故障带来的影响,Redis也提供了完善的故障恢复机制:哨兵。下面就来具体来看看Redis的故障恢复是如何做的…

聊聊启程国际旅行社口碑怎么样,是否值得游客选择

2026年北京文旅市场迎来高质量复苏,文旅融合与科技赋能成为行业升级的核心方向。无论是文化深度体验线路的设计、入境游全链路服务,还是智慧文旅场景的打造,优质旅行社的专业能力直接决定游客的出行体验与企业的市场…

Java版LeetCode热题100之单词拆分:从动态规划到面试实战的全面解析

Java版LeetCode热题100之单词拆分&#xff1a;从动态规划到面试实战的全面解析 本文深入剖析 LeetCode 第139题「单词拆分」&#xff0c;涵盖题目理解、算法设计、代码实现、复杂度分析、优化思路、数据结构基础、面试应对策略以及实际应用场景等多个维度&#xff0c;是一篇面向…

【软考每日一练015】计算机网络:DNS 递归查询与迭代查询解析

【软考每日一练015】计算机网络&#xff1a;DNS 递归查询与迭代查询解析 1. 原题目 题目&#xff1a; 主机 PC 对某个域名进行查询&#xff0c;最终由该域名的授权域名服务器解析并返回结果&#xff0c;查询过程如下图所示。这种查询方式中不合理的是&#xff08; &#xff0…

2026年最新在线客服软件与系统推荐:全面评测与选择指南

随着AI大模型与多模态技术的普及,在线客服系统已从“渠道承接”升级为“业务智能引擎”,全渠道整合、AI自主决策、数据安全合规成为企业选型核心诉求。当前市场呈现“AI原生架构为主流,垂直场景定制为补充”的格局,…

2026医学考研课程排名前十出炉!避坑指南+选课干货全整理

2026医学考研课程排名前十出炉!避坑指南+选课干货全整理宝子们!医学考研有多卷不用多说了吧?2025年医学类考研报名人数都突破123万了,较上一年增长14.7%,热门院校部分专业报录比甚至超过10:1。想在千军万马中成功…

近6亿元!欧洲航天局站台,这家瑞士企业用3D打印重构卫星制造

不只是火箭&#xff0c;3D打印也正在造“卫星”。 2026年1月22日&#xff0c;据资源库了解&#xff0c;欧洲卫星系统与射频&#xff08;RF&#xff09;产品制造商SWISSto12宣布&#xff0c;通过欧洲航天局&#xff08;ESA&#xff09;旗下ARTES HummingSat合作项目&#xff0c;…

arcGis连不上HighGoDB的解决方案

文章目录 环境文档用途详细信息相关文档 环境 系统平台&#xff1a; 版本&#xff1a;4.7.6 文档用途 本文档主要介绍如何使得arcGis客户端能正确的连接HighGoDB数据库 详细信息 问题情况&#xff1a; 解决办法&#xff1a; 第一步&#xff1a;HighGoDB–>ArcGis的dl…

2026论文降AIGC率工具排行榜,CSDN权威评测AI率狂降至8%,多平台通杀还加密防漏!

作为常年和论文、文案打交道的“AI检测闯关人”,2025-2026年实测了20+款降AIGC率工具,踩过机械改写的坑,也挖到了真宝藏神器。2026年知网、维普等AI检测算法又双叒升级,单纯同义词替换早已失效,这份CSDN、凤凰网等…

Java版LeetCode热题100之最长递增子序列:从O(n²)动态规划到O(n log n)贪心+二分的深度剖析

Java版LeetCode热题100之最长递增子序列&#xff1a;从O(n)动态规划到O(n log n)贪心二分的深度剖析 本文全面解析 LeetCode 第300题「最长递增子序列」&#xff08;Longest Increasing Subsequence, LIS&#xff09;&#xff0c;涵盖题目理解、两种经典解法&#xff08;DP与贪…

大数据毕业设计选题推荐:基于Spark+Django的旅游评价分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 数据挖掘

✍✍计算机毕设指导师** ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡有什么问题可以…

Java版LeetCode热题100之乘积最大子数组:动态规划中的正负博弈与空间优化艺术

Java版LeetCode热题100之乘积最大子数组&#xff1a;动态规划中的正负博弈与空间优化艺术 本文深入剖析 LeetCode 第152题「乘积最大子数组」&#xff0c;从问题本质出发&#xff0c;详解为何普通最大子序和思路失效&#xff0c;如何通过维护最大/最小值双状态解决负数翻转问题…

2026年高适配工单系统品牌厂商盘点,靠谱推荐清单

2026年,企业数字化协同进入深水区,工单系统作为连接服务需求与执行闭环的核心工具,已从单一客服场景延伸至全业务链路。随着跨部门协作、现场服务等需求激增,市场对系统的合规性、智能化、集成能力要求显著提升,一…