Java @PostConstruct时睡眠不会触发ContextClosedEvent

Java @PostConstruct时睡眠不会触发ContextClosedEvent,java,spring,spring-boot,Java,Spring,Spring Boot,如果主线程进入睡眠状态,例如30秒,则从Spring@组件,@PostConstruct 在这两者之间,通过运行kill 但是在这种情况下,ContextClosedEvent上的@PreDestroy和EventListener都不会被触发 例如,当一个bean从PostConstruct休眠并且一个SIGTERM被发送到Spring boot应用程序时,我们可以监听哪个核心Spring事件的日志?根据其中一条评论,问题是@PostConstruct 所以你的问题实际上是你在@PostCons

如果主线程进入睡眠状态,例如30秒,则从Spring
@组件
@PostConstruct

在这两者之间,通过运行
kill

但是在这种情况下,
ContextClosedEvent
上的
@PreDestroy
EventListener
都不会被触发


例如,当一个bean从
PostConstruct
休眠并且一个SIGTERM被发送到Spring boot应用程序时,我们可以监听哪个核心Spring事件的日志?

根据其中一条评论,问题是
@PostConstruct

所以你的问题实际上是你在@PostConstruct中做了太多的工作


换句话说,由于Spring仍处于初始化自身的过程中,它甚至可能还没有进入初始化过程的步骤,在该步骤中if注册了shutdown钩子,因此它甚至从未收到关于SIGTERM的通知


我认为您应该问的问题是“为什么主线程在设置环境时会休眠”。@Kayaman,所以
thread.currentThread().getName()
@Component
bean
@PostConstruct
打印
main
。我想你是说,
main
正在睡觉,spring不能同时处理SIGTERM事件吗?不,我是说你问错了问题。如果您仍在运行
@PostConstruct
code,则环境尚未设置。在那一点上杀死它并不能保证一个优雅的退出。换句话说,由于Spring仍在初始化自己的过程中,它甚至可能还没有达到初始化过程中if注册关机钩子的步骤,因此它甚至从未被通知SIGTERM然而,更重要的是,拥有一个休眠的
@PostConstruct
方法的简单错误。为什么会这样?@fortm所以你的问题实际上是你在
@PostConstruct
中执行了太多的工作。