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

时间:2019-01-04 03:01:35

标签: spring spring-boot

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

2 个答案:

答案 0 :(得分:0)

理想情况下,它应该可以工作,但请确保调用SIGTERM而不是SIGKILL

在某些情况下,我们运行spring boot应用程序

Docker

执行docker stop时,幕后发生的事情是

  

停止一个或多个运行中的容器   容器将收到SIGTERM,并在宽限期之后收到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 Scheduler Task和JPA Entity Manager。 收到SIGTERM后,它将首先关闭所有内容,最后调用preDestory。

我不确定您需要进一步清理,但请确保它是否已清理。

优雅地关闭嵌入式servlet容器

您还可以自定义并编写自己的关机钩子。 Refer to this很好的讨论和示例代码

重组嵌入式Web服务器软件包

请注意上面链接中的示例代码。如果您使用的是较新版本的Springboot,则可能缺少软件包。

请参考more detail on changed methods and classes

答案 1 :(得分:0)

对于<script src="https://unpkg.com/react@16/umd/react.development.js"></script> <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script> <div id="root"></div> Docker 的@MyTwoCents答案仅作少量补充,请确保仅使用@PreDestroy代替ENTRYPOINTCMD-那么您将作为主进程运行应用程序,并且SIGTERM将发送到您的应用程序