当前位置: 首页 > article >正文

为什么要用 ApplicationReadyEvent 来初始化 RabbitTemplate 回调?

文章目录一、结论先行二、ApplicationReadyEvent 到底是什么三、Spring Boot 启动生命周期四、你在做什么为什么这件事对时机敏感五、为什么不能随便写在 PostConstruct 里六、为什么 ApplicationReadyEvent 是“黄金时间点”七、用生活比喻八、几种常见初始化方式对比九、更推荐的工程写法两种十、总结很多时候看到下面这行代码会懵publicclassRabbitInitConfigApplicationListenerimplementsApplicationListenerApplicationReadyEvent看起来只是“监听一个事件”但它背后体现的是Spring Boot 生命周期理解与RabbitTemplate 初始化时机控制。ApplicationReadyEvent到底是什么为什么不能随便在PostConstruct里 setConfirmCallbackRabbitTemplate 的自动配置顺序是怎样的常见坑有哪些推荐的工程写法是什么一、结论先行implements ApplicationListenerApplicationReadyEvent的意思是等 Spring Boot 应用完全启动之后再执行初始化逻辑。也就是等所有 Bean 自动配置都完成之后再给 RabbitTemplate 设置回调。这种写法的核心价值是避免初始化太早被覆盖 / 无效 / 不稳定。二、ApplicationReadyEvent 到底是什么Spring Boot 启动过程中会发布多个事件常见的包括ApplicationStartingEventApplicationEnvironmentPreparedEventApplicationPreparedEventContextRefreshedEventApplicationStartedEvent✅ApplicationReadyEvent最晚、最稳你可以把它理解成“应用已经能对外提供服务了”当ApplicationReadyEvent发布时一般意味着Spring 容器已经刷新完成所有 Bean 都初始化完了CommandLineRunner / ApplicationRunner 都已经执行完Web 容器如 Tomcat已经启动并监听端口应用已经 ready可以接请求 所以它是一个“非常稳妥的初始化时机”。三、Spring Boot 启动生命周期为了准确理解“为什么必须等到 ready”我们把启动流程拆得更细一点1) 读取 application.yml / application.properties 2) 创建 ApplicationContext容器 3) 扫描配置类SpringBootApplication / Configuration 4) 开始自动配置AutoConfiguration 生效 5) 注册 BeanDefinition 6) 创建 Bean 实例构造方法 7) 依赖注入Autowired 8) Bean 初始化回调 - PostConstruct - InitializingBean.afterPropertiesSet - 自定义 init-method 9) Context refresh 完成 10) 执行 Runner - CommandLineRunner - ApplicationRunner 11) 启动 Web ServerTomcat/Netty 12) 发布 ApplicationReadyEvent ✅ 最终阶段关键点Spring Boot 的“自动配置”可能在你之后继续修改某些 Bean这就是为什么“太早 setCallback” 会被覆盖。四、你在做什么为什么这件事对时机敏感你在做的是rabbitTemplate.setConfirmCallback(...)rabbitTemplate.setReturnsCallback(...)这属于✅修改 RabbitTemplate 的全局行为它不是“普通字段赋值”而是改变整个 MQ 投递链路的回调策略。这种全局行为配置非常怕两件事RabbitTemplate 还没完全初始化好RabbitTemplate 后续还会被 Spring Boot 自动配置“再加工”五、为什么不能随便写在 PostConstruct 里很多人第一反应是“我在 Bean 初始化完之后 setCallback不就行了吗”比如PostConstructpublicvoidinit(){rabbitTemplate.setConfirmCallback(...);}❌ 这可能会出的问题真实项目常见回调被覆盖最常见RabbitTemplate 是 Spring Boot 自动配置出来的组件它可能在后续自动配置阶段继续设置默认属性。你在PostConstruct设置回调后PostConstruct 执行你 setCallback ↓ 后续某个 AutoConfiguration 执行重新 setCallback ↓ 你的回调失效你还以为生效了这种问题的特点是不报错只是“回调没触发”非常难排查多个 RabbitTemplate / 多个 ConnectionFactory 时混乱如果项目后来引入多数据源 RabbitMQ多个 RabbitTemplate或者框架自动注册了另一个 template你早期 set 的可能不是最终用于发送消息的那个 template。六、为什么 ApplicationReadyEvent 是“黄金时间点”当ApplicationReadyEvent发布时✅ 所有自动配置已经执行完✅ 你 setCallback 不会再被覆盖✅ RabbitTemplate 已处于最终状态✅ 应用已 ready行为可预测换句话说这是“房子装修完后再挂窗帘”的时刻。七、用生活比喻❌ 太早做构造方法 / PostConstruct你在装修阶段装窗帘后面装修队拆墙、刷漆、换窗户窗帘可能被拆掉、挂歪、甚至换成默认窗帘✅ ReadyEvent 做装修完家具都摆好了钥匙交付你再挂窗帘这就是最终状态不会再变八、几种常见初始化方式对比方式触发时机是否可能被自动配置覆盖推荐程度构造方法Bean 创建✅ 非常可能❌PostConstructBean 初始化✅ 可能⚠️InitializingBeanBean 初始化✅ 可能⚠️CommandLineRunner容器启动后很少✅✅ ApplicationReadyEvent应用完全就绪几乎不会✅✅✅九、更推荐的工程写法两种方案 A现在这种监听 ReadyEvent优点最直观时机最稳不影响自动配置方案 B用RabbitTemplateConfigurer/ Bean 后置增强高级如果你想更“Spring 风格”也可以考虑自定义RabbitTemplatebean慎重或用SmartInitializingSingleton或用EventListener(ApplicationReadyEvent.class)例如更简洁的写法ComponentSlf4jpublicclassRabbitTemplateCallbackConfig{privatefinalRabbitTemplaterabbitTemplate;publicRabbitTemplateCallbackConfig(RabbitTemplaterabbitTemplate){this.rabbitTemplaterabbitTemplate;}EventListener(ApplicationReadyEvent.class)publicvoidinit(){rabbitTemplate.setConfirmCallback((correlationData,ack,reason)-{...});rabbitTemplate.setReturnsCallback(returned-{...});}}这个和你现在做的事本质一样同样是“等 ready 再设置”。十、总结RabbitTemplate 的回调属于全局行为配置必须在自动配置结束后绑定。所以用ApplicationReadyEvent是最稳妥、最不踩坑的方式。

相关文章:

为什么要用 ApplicationReadyEvent 来初始化 RabbitTemplate 回调?

文章目录一、结论先行二、ApplicationReadyEvent 到底是什么?三、Spring Boot 启动生命周期四、你在做什么?为什么这件事对时机敏感?五、为什么不能随便写在 PostConstruct 里?六、为什么 ApplicationReadyEvent 是“黄金时间点”…...

Spring AI对话记忆存入Redis持久化

使用redissonredisson配置类/*** Redis/Redisson 配置:单机模式,供 RAG Agent 的 RedisSaver(会话记忆)等使用。*/ Configuration public class RedisMemory {private final String host;private final int port;public RedisMemo…...

GTE-Pro开源镜像实操手册:从Pull镜像到Query测试的端到端流程

GTE-Pro开源镜像实操手册:从Pull镜像到Query测试的端到端流程 1. 引言:为什么你需要一个企业级语义检索引擎? 想象一下这个场景:你是一家公司的员工,想查一下“怎么报销吃饭的发票”。你打开公司的知识库&#xff0c…...

Llama-3.2V-11B-cot部署教程:使用vLLM优化推理吞吐量的实操步骤

Llama-3.2V-11B-cot部署教程:使用vLLM优化推理吞吐量的实操步骤 1. 项目介绍 Llama-3.2V-11B-cot是一个强大的视觉语言模型,它不仅能理解图片内容,还能像人类一样进行逐步推理。这个模型基于Meta的Llama 3.2 Vision架构,拥有110…...

scrapy学习

conda create -n scrapy-309 python3.09conda activate scrapy-309pip install scrapy2.6.3 Twisted22.10.0 urllib31.26.18 parsel1.7.0 -i https://pypi.tuna.tsinghua.edu.cn/simple创建项目scrapy startproject baidu_spiderscrapy genspider baidu https://www.baidu.com启…...

Phi-4-mini-reasoning开源模型一文详解:ollama部署+128K上下文实战应用

Phi-4-mini-reasoning开源模型一文详解:ollama部署128K上下文实战应用 1. 模型简介:轻量级推理专家 Phi-4-mini-reasoning 是一个专门为复杂推理任务设计的开源模型,它最大的特点是"小而精"——虽然模型体积不大,但在…...

寻音捉影·侠客行多场景:支持暗号权重配置的关键词重要性分级检索策略

寻音捉影侠客行多场景:支持暗号权重配置的关键词重要性分级检索策略 1. 引言:当江湖侠客学会了“听声辨位” 你有没有过这样的经历?在一段长达数小时的会议录音里,老板突然提到了一个关键项目,但你却怎么也找不到那句…...

Alpamayo-R1-10B惊艳案例:暴雨天气图像+‘缓行通过积水区’指令的因果链输出

Alpamayo-R1-10B惊艳案例:暴雨天气图像‘缓行通过积水区’指令的因果链输出 1. 项目简介:一个能“看懂”路况并“思考”的自动驾驶大脑 想象一下,你正开车经过一个暴雨后的十字路口,前方路面有明显的积水。你会怎么做&#xff1…...

Qwen3-TTS语音合成教程:如何通过指令微调实现‘严肃’‘幽默’‘关切’三类语调

Qwen3-TTS语音合成教程:如何通过指令微调实现‘严肃’‘幽默’‘关切’三类语调 你有没有想过,让AI语音助手不仅能说话,还能根据你的指令,用“严肃”的语调播报新闻,用“幽默”的语气讲个笑话,或者用“关切…...

MogFace检测效果对比展示:CVPR2022模型 vs 传统Haar级联在遮挡场景表现

MogFace检测效果对比展示:CVPR2022模型 vs 传统Haar级联在遮挡场景表现 人脸检测技术,听起来挺高大上,但说白了就是让电脑在图片里找到人脸的位置。这技术现在到处都在用,从手机解锁到安防监控,再到美颜相机&#xff…...

Fish Speech 1.5开发者案例:为微信小程序集成TTS语音播报功能

Fish Speech 1.5开发者案例:为微信小程序集成TTS语音播报功能 1. 引言:当小程序需要“开口说话” 想象一下,你正在开发一个在线教育类微信小程序。课程内容很精彩,但用户长时间盯着屏幕阅读文字,眼睛容易疲劳。如果能…...

DASD-4B-Thinking保姆级教程:vLLM多模型路由+Chainlit动态切换

DASD-4B-Thinking保姆级教程:vLLM多模型路由Chainlit动态切换 1. 开篇:为什么你需要这个组合方案? 如果你正在寻找一个既能进行深度思考推理,又能灵活切换不同模型的解决方案,那么你来对地方了。今天要介绍的DASD-4B-T…...

灵感画廊入门必看:如何理解‘灵感契合度’= CFG Scale × 风格权重

灵感画廊入门必看:如何理解‘灵感契合度’ CFG Scale 风格权重 “见微知著,凝光成影。将梦境的碎片,凝结为永恒的视觉诗篇。 ” 灵感画廊是一款基于 Stable Diffusion XL 1.0 打造的沉浸式艺术创作工具。它摒弃了传统复杂界面,采…...

Qwen3-TTS-12Hz-Base惊艳效果:西班牙语弗拉门戈+阿拉伯语诗歌吟诵

Qwen3-TTS-12Hz-Base惊艳效果:西班牙语弗拉门戈阿拉伯语诗歌吟诵 你听过AI用西班牙语唱出弗拉门戈的激情,再用阿拉伯语吟诵古老诗歌的深邃吗?今天,我要带你体验Qwen3-TTS-12Hz-1.7B-Base带来的声音魔法。这不是普通的语音合成&am…...

墨语灵犀在非遗保护中的应用:方言口述史→标准语+多语种译文

墨语灵犀在非遗保护中的应用:方言口述史→标准语多语种译文 1. 引言:当古老的声音遇见现代科技 想象一下,一位年过八旬的老人,坐在老屋的门槛上,用浓重的乡音讲述着祖辈传下来的故事。他的话语里,有即将失…...

Llama-3.2V-11B-cot实战:构建高校实验报告图像的自动批改与反馈生成系统

Llama-3.2V-11B-cot实战:构建高校实验报告图像的自动批改与反馈生成系统 1. 项目背景与价值 在高校实验教学中,教师需要批改大量学生提交的实验报告图像。传统的人工批改方式存在效率低、反馈不及时、标准不统一等问题。Llama-3.2V-11B-cot作为支持系统…...

translategemma-27b-it效果对比:与DeepL/Gemini/Google Translate图文翻译精度PK

translategemma-27b-it效果对比:与DeepL/Gemini/Google Translate图文翻译精度PK 翻译工具我们每天都在用,但你真的了解它们的实力吗?特别是当翻译任务从纯文本扩展到“图文并茂”时,传统的翻译引擎还能否胜任?今天&a…...

Nano-Banana Studio多场景落地:服装碳足迹报告配套材料分解可视化图

Nano-Banana Studio多场景落地:服装碳足迹报告配套材料分解可视化图 1. 引言:当服装拆解遇上碳足迹报告 想象一下,你是一家服装品牌的产品经理,正在准备新一季产品的碳足迹报告。传统的报告里堆满了数字和表格:棉花种…...

Docker-镜像-命令清单

1. docker images 功能 查看所有镜像 语法 docker images [option] [repository[:tag]]常见参数 --a :列出所有镜像,包括中间层镜像(默认不显示中间层)--digests:限制镜像的 摘要信息-q: 只显示镜像ID--no-trunc:显示完整镜像信息&#xff0c…...

EVA-01多场景落地:农业技术站用EVA-01识别病虫害叶片图并生成防治方案

EVA-01多场景落地:农业技术站用EVA-01识别病虫害叶片图并生成防治方案 想象一下这个场景:一位农业技术员在田间地头,用手机拍下一片长了奇怪斑点的玉米叶子。他需要立刻知道这是什么病、怎么治,但手头没有专家,翻书查…...

Qwen3-4B-Thinking多场景落地:从代码生成到技术问答的实战案例

Qwen3-4B-Thinking多场景落地:从代码生成到技术问答的实战案例 1. 引言:一个能“思考”的代码助手 如果你经常写代码,肯定遇到过这样的场景:面对一个复杂功能,脑子里有大概思路,但具体实现细节卡壳了&…...

Stable Yogi Leather-Dress-Collection生产环境:低配GPU(4GB)稳定运行实测报告

Stable Yogi Leather-Dress-Collection生产环境:低配GPU(4GB)稳定运行实测报告 1. 项目背景与核心价值 在动漫风格图像生成领域,2.5D皮衣穿搭一直是个热门但技术门槛较高的创作方向。传统方法需要用户手动调整大量参数&#xff…...

Qwen3-ForcedAligner-0.6B部署案例:中小企业私有化部署保障语音数据不出域

Qwen3-ForcedAligner-0.6B部署案例:中小企业私有化部署保障语音数据不出域 1. 引言:当语音数据安全成为企业刚需 想象一下这个场景:你是一家在线教育公司的产品经理,每天有上千小时的课程录音需要制作字幕。这些录音里包含了老师…...

StructBERT文本相似度模型部署教程:Windows本地快速体验指南

StructBERT文本相似度模型部署教程:Windows本地快速体验指南 1. 引言:让电脑学会“理解”文本的相似度 你有没有遇到过这样的场景?想在海量文档里快速找到内容相似的资料,或者想判断两段用户评论是不是在说同一件事,…...

HY-Motion 1.0效果实测:十亿参数模型动作流畅度对比分析

HY-Motion 1.0效果实测:十亿参数模型动作流畅度对比分析 1. 引言:重新定义3D动作生成标准 当你在制作3D动画时,是否曾经为寻找合适的角色动作而烦恼?传统的动作捕捉成本高昂,手动制作又耗时耗力。现在,只…...

AI头像生成器惊艳效果:Qwen3-32B生成‘蒸汽朋克猫娘’Prompt细节拆解

AI头像生成器惊艳效果:Qwen3-32B生成‘蒸汽朋克猫娘’Prompt细节拆解 1. 引言:当AI遇上头像创意设计 你有没有遇到过这样的困扰:想要一个独特的头像,但自己不会画画,又找不到合适的设计师?或者有了创意想…...

模型服务治理:实时口罩检测-通用OpenTelemetry链路追踪接入

模型服务治理:实时口罩检测-通用OpenTelemetry链路追踪接入 1. 项目背景与价值 在当今的AI应用场景中,实时口罩检测已经成为许多公共场所和企业的必备功能。无论是商场入口、办公大楼还是公共交通场所,都需要快速准确地检测人员是否佩戴口罩…...

GPU算力高效利用:internlm2-chat-1.8b在A10/A100集群上的批处理优化实践

GPU算力高效利用:internlm2-chat-1.8b在A10/A100集群上的批处理优化实践 1. 为什么需要批处理优化 在实际的AI模型部署中,我们经常面临这样的困境:单个用户的请求往往无法充分利用GPU的强大算力。比如使用internlm2-chat-1.8b这样的模型处理…...

Stable Yogi Leather-Dress-Collection效果实测:512x768尺寸下多头畸变归零的2.5D稳定性验证

Stable Yogi Leather-Dress-Collection效果实测:512x768尺寸下多头畸变归零的2.5D稳定性验证 1. 项目概述 Stable Yogi Leather-Dress-Collection是一款基于Stable Diffusion v1.5和Anything V5动漫底座模型开发的2.5D皮衣穿搭生成工具。该工具通过深度优化实现了…...

计算机视觉opencv之边缘检测轮廓检测轮廓绘制轮廓近似

一、边缘检测上一个博客中有讲到边缘检测中的sobel算子的方法我们接着介绍其他方法1.scharr算子和laplacion算子这里我加上了sobel算计,进行对比#sobel算子 import cv2 image1cv2.imread(r"D:\project\123s.jpg") image1_x_64cv2.Sobel(image1,cv2.CV_64F…...