我有一个Spring Boot应用程序,当我们使用kill pid终止进程时,需要清除或清理资源。 @predestroy注释的方法不起作用,也不会被调用。请建议我们如何捕获SIGTERM并调用predestroy方法
答案 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,则可能缺少软件包。
答案 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
代替ENTRYPOINT
或CMD
-那么您将作为主进程运行应用程序,并且SIGTERM将发送到您的应用程序