Spring Cloud Stream使用@ServiceActivator启动报循环引用异常咨询
异常产生原因
这个异常并非真正的循环依赖导致,是Spring Integration JMX导出器(IntegrationMBeanExporter)的初始化时序bug触发了Spring单例Bean的创建检测机制:
- 你通过
@ServiceActivator注解标注的错误处理方法,会在容器启动后期由MessagingAnnotationPostProcessor扫描,动态生成名为profileListener.handleErrors.serviceActivator的ServiceActivator端点Bean - 该Bean在初始化执行后置处理流程时,
IntegrationMBeanExporter作为BeanPostProcessor会尝试为当前端点注册JMX监控指标,此时Bean还未完成初始化,仍处于Spring标记的"正在创建"状态 IntegrationMBeanExporter在注册监控逻辑中主动调用getBean()尝试获取当前正在创建的Bean实例,直接触发了Spring单例注册的循环引用检测,抛出BeanCurrentlyInCreationException- 这个异常发生在JMX注册的非核心流程,会被Spring内部捕获处理,因此不会阻断应用正常启动,只会打印错误日志。
另外你贴的错误处理代码存在笔误:方法入参名定义为in,日志打印时却调用了em.toString(),实际运行时会出现变量找不到的错误,需要同步修正。
解决方案
任选以下一种方式即可消除该错误日志:
- 精准关闭Spring Integration的JMX自动注册,在配置文件中添加如下配置:
spring: integration: jmx: enabled: false
该配置仅关闭Spring Integration组件的MBean注册能力,不会影响Spring其他模块的JMX功能,是成本最低的修复方案。
- 升级Spring Integration版本到5.5.14及以上,该初始化时序bug已经在后续小版本中完成修复,
IntegrationMBeanExporter不会在Bean未完成初始化时提前拉取实例。 - 改用Java Config手动注册errorChannel的消息处理端点,替代
@ServiceActivator注解声明的方式,避开注解扫描注册阶段的时序冲突。
注意:你配置的
error-channel-enabled: true参数本身没有问题,不是触发该异常的原因。
内容的提问来源于stack exchange,提问作者victor hugo
相关产品推荐
相关产品推荐

