Java @PostConstruct时睡眠不会触发ContextClosedEvent
如果主线程进入睡眠状态,例如30秒,则从SpringJava @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
@组件,@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
中执行了太多的工作。