2016-04-18 47 views
6

我们有一个多线程的Spring Boot应用程序,它在Linux机器上作为守护程序运行。当我尝试像这样通过start-stop-daemon停止应用程序时如何使用start-stop-daemon优雅地关闭Spring Boot应用程序

start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME 

SIGTERM信号被发送并且应用程序立即结束。不过,我希望应用程序等待,直到每个线程完成它的工作。

有没有什么办法,在收到SIGTERM信号时如何管理发生了什么?

+0

如果你有兴趣在正常关闭嵌入式servlet容器,请参见[今年春季启动问题(https://github.com/spring-projects/spring-boot/issues/4657 )。 –

回答

13

Spring Boot应用程序向JVM注册一个关闭挂钩,以确保ApplicationContext在退出时正常关闭。创建实现DisposableBean或具有@PreDestroy注释的方法的bean(或bean)。这个bean将在应用程序关闭时调用。

http://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#boot-features-application-exit

+1

谢谢你的提示。但是这并不能解决我的问题,因为我需要截取SIGTERM信号并等待应用程序完成它的工作。这允许我做一些清理,但如果我理解正确,这不会阻止我终止当前正在运行的方法。 – Michal

+0

@Michal你是对的,它不允许你阻止终止。但它允许实现线程停止逻辑并等待线程完成。如果关闭挂钩工作,JVM将不会被终止。 – Evgeny

+0

我想给你一个加2,但我只能给1 ... –