一次空指针问题引发的 Spring 生命周期思考
某团队负责的内容安全审核系统基于RocketMQ构建异步管道模式,对接视频、评论等业务方,涵盖进审、审核、出审及ES审计日志存储环节。一次服务升级重启后,部分业务方反馈审核结果未下发,但ES日志显示消息已被正常消费并写入,且问题仅在启动初期偶现,运行一段时间后自动恢复。 排查发现,业务结果下发依赖的Producer实例为空,而ES审计生产者工作正常。原因在于ES生产者通过Spring标准@Bean声明并指定initMethod,在Bean初始化阶段即完成创建;业务Producer则由ProducerManager在实现ApplicationRunner的run()方法中动态创建并存入Map。由于未配置@Order,ConsumerManager与ProducerManager的执行顺序不确定,若消费者先启动,可能拉取消息时业务Producer尚未创建,触发空指针。 团队通过添加@Order注解控制Runner执行顺序,线上报错消失。但深入源码后发现,@Order仅控制多个ApplicationRunner间的执行顺序,不影响Bean生命周期。真正问题是业务Producer的创建时机脱离了Spring管理,修复仅是掩盖了设计缺陷,需重新审视初始化时序设计。
本文摘要由千智坊基于公开报道整理,查看完整内容:阅读原文(InfoQ)→
