Spring Boot从2.0.4升级到2.6.9启动失败求助
问题原因及解决方向
一、errorChannel订阅错误 + BeanCreationNotAllowedException + Tomcat启动失败
核心原因
- Spring Integration版本适配冲突:Spring Boot 2.4+对Spring Integration的
errorChannel处理逻辑做了重大调整,2.0.x版本中自定义的错误通道订阅方式(比如@ServiceActivator直接绑定errorChannel)在新版本中会触发订阅冲突,导致上下文初始化中断。 - Spring Cloud与Spring Boot版本不匹配:你使用的Spring Cloud 2020.0.3(Ilford)官方适配的是Spring Boot 2.4.x,强行升级到2.6.9会引发组件间的兼容性问题,尤其是Spring Cloud Bus、Stream这类依赖Spring Integration的组件,会导致错误通道初始化失败。
- BeanCreationNotAllowedException是次生问题:前面的errorChannel错误导致Spring上下文刷新失败,后续仍有Bean尝试创建,触发了Spring的Bean创建阻止机制。
解决方向
- 对齐Spring Cloud与Spring Boot版本:将Spring Cloud升级到2021.0.3(Jubilee),该版本官方适配Spring Boot 2.6.x,能解决绝大多数跨版本兼容性问题。
- 调整errorChannel配置:如果项目中有自定义错误处理逻辑,替换旧的
@ServiceActivator(inputChannel = "errorChannel")方式,改用IntegrationFlow构建错误处理流程,示例:@Bean public IntegrationFlow errorHandlingFlow() { return IntegrationFlows.from("errorChannel") .handle(message -> { // 自定义错误处理逻辑 }) .get(); } - 开启调试日志定位冲突:添加日志配置
logging.level.org.springframework.integration=DEBUG,查看errorChannel订阅失败的具体栈信息,定位到冲突的Bean或第三方组件配置。
二、Redisson线程未停止导致内存泄漏警告
核心原因
- Redisson版本适配不足:旧版本Redisson未适配Spring Boot 2.6.x的Bean生命周期变更,比如
@PreDestroy执行时机、DisposableBean回调逻辑的调整,导致上下文关闭时Redisson的Netty线程池未被正确销毁。 - 销毁方法未正确注册:部分自定义Redisson配置未指定
destroyMethod,Spring无法触发Redisson的shutdown()方法,导致线程资源泄漏。
解决方向
- 升级Redisson版本:将Redisson升级到3.17.x及以上版本,该版本对Spring Boot 2.6.x的生命周期管理有完善适配,能自动感知上下文关闭事件并停止内部线程。
- 手动指定销毁方法:如果无法立即升级Redisson,在RedissonClient的配置Bean上添加
destroyMethod:@Bean(destroyMethod = "shutdown") public RedissonClient redissonClient() { // 你的Redisson配置逻辑 } - 排查自定义线程资源:检查项目中是否有手动创建的Redisson相关线程池,确保在Bean销毁时调用
shutdown()或shutdownNow()释放资源。
整体排查步骤
- 优先升级Spring Cloud到2021.0.3,解决基础版本兼容性问题;
- 升级Redisson到兼容版本,修复内存泄漏;
- 通过调试日志定位errorChannel的具体冲突点,调整配置。
内容的提问来源于stack exchange,提问作者Abhilash Ramteke
相关产品推荐
相关产品推荐

