Spring Boot优雅关闭遇BeanCreationNotAllowedException,如何延长Bean销毁等待时长?
解决Spring Boot优雅关闭时BeanCreationNotAllowedException的问题
一、延长Bean销毁等待时长的方法
可以通过配置直接调整Spring Boot优雅关闭的等待时长,给销毁阶段的Bean留出更多收尾时间:
- 在
application.properties中添加:# 设置每个销毁阶段的超时时间,单位秒,默认30秒,可根据实际需求调整 spring.lifecycle.timeout-per-shutdown-phase=60 - 或者在
application.yml中配置:spring: lifecycle: timeout-per-shutdown-phase: 60
二、更彻底的解决方案(推荐)
延长时长只是临时缓解手段,更建议从根源避免销毁阶段的Bean请求操作:
- 给队列监听器添加优雅停止逻辑
给监听器类添加@PreDestroy注解的方法,在Spring开始销毁Bean前,主动停止队列监听任务,中断线程循环,确保线程在Bean销毁前完成收尾,不再调用beanFactory.getBean。示例代码:@Component public class QueueListener { private volatile boolean isRunning = true; private Thread listenerThread; @PostConstruct public void startListener() { listenerThread = new Thread(() -> { while (isRunning) { // 队列监听、处理逻辑 } }); listenerThread.start(); } @PreDestroy public void stopListener() { isRunning = false; try { // 等待线程终止,可自定义超时时间 listenerThread.join(5000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } - 避免动态获取Bean
尽量通过构造函数注入或@Autowired注解提前注入监听器所需的Bean,而非在运行时调用beanFactory.getBean动态获取,从根本上消除销毁阶段的Bean获取风险。 - 控制线程关闭顺序
如果监听器是自定义线程,可手动注册ShutdownHook,确保Spring开始销毁Bean前,先完成监听器线程的停止操作。
错误核心原因:Spring启动Bean销毁流程后,会将BeanFactory标记为"不可创建新Bean"的状态,此时若监听器线程仍在运行并尝试获取Bean,就会触发
BeanCreationNotAllowedException。
内容的提问来源于stack exchange,提问作者user2455862
相关产品推荐
相关产品推荐

