gpt4 book ai didi

Spring Boot 应用程序优雅地捕获 SIGTERM 信号并调用 predestroy 方法

转载 作者:行者123 更新时间:2023-12-03 20:16:09 24 4
gpt4 key购买 nike

我有一个 Spring Boot 应用程序,当我们使用 kill pid 终止进程时,它需要清除或清理资源。 @predestroy 带注释的方法不起作用,也没有被调用。请建议我们如何捕获 SIGTERM 并调用 predestroy 方法

最佳答案

理想情况下,它应该可以工作,但要确保 SIGTERM被调用而不是 SIGKILL我有一些我们运行 Spring Boot 应用程序的情况
docker
当你执行 docker stop幕后发生的事情是

Stop one or more running containers The main process inside thecontainer will receive SIGTERM, and after a grace period, SIGKILL


kill 9955 => SIGTERM 被调用 kill -9 9955 => SIGKILL 被称为
Refer here有关杀死的更多详细信息。
现在回到 @PreDestroy
我在我的 SpringBoot 应用程序中添加了以下行
@PreDestroy
public void tearDown() {
System.out.println("Shutting Down...............the ");
}
执行 kill portno 时得到以下输出
2019-01-04 10:52:44.776  INFO o.s.s.c.ThreadPoolTaskScheduler / shutdown - 208 : Shutting down ExecutorService 'taskScheduler'
2019-01-04 10:52:44.783 INFO o.s.s.c.ThreadPoolTaskExecutor / shutdown - 208 : Shutting down ExecutorService 'applicationTaskExecutor'
2019-01-04 10:52:44.785 INFO o.s.o.j.LocalContainerEntityManagerFactoryBean / destroy - 597 : Closing JPA EntityManagerFactory for persistence unit 'default'
2019-01-04 10:52:44.792 INFO c.z.h.HikariDataSource / close - 350 : HikariPool-1 - Shutdown initiated...
2019-01-04 10:52:44.800 INFO c.z.h.HikariDataSource / close - 352 : HikariPool-1 - Shutdown completed.
Shutting Down...............
正如您在日志中看到的,我有 2 个正在运行的调度程序任务和 JPA 实体管理器。
收到 SIGTERM它首先关闭所有这些,最后调用 preDestory。
我不确定您还需要做些什么清理工作,但请确保它是否已经清理过。
优雅地关闭嵌入式 servlet 容器
您还可以自定义和编写自己的关闭优雅 Hook 。
Refer to this很好的讨论和示例代码
重构嵌入式 Web 服务器包
请注意上面链接中的示例代码。如果您使用较新版本的 Springboot,机会是 包可能丢失。
请参阅 more detail on changes methods and classes

关于Spring Boot 应用程序优雅地捕获 SIGTERM 信号并调用 predestroy 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54032609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com