基于Spring Boot (Tomcat)的应用程序作为守护进程 - 如何停止?

3
我编写了一个使用内嵌Tomcat作为容器的Spring Boot Web服务。如果系统重新启动,我希望将一些信息备份到MySQL数据库中。
在我的Web服务中,我使用@Scheduled()和@PreDestroy来运行备份。当我使用^C停止服务器时,这个操作是成功的。
但是,当我使用sysV脚本(/etc/init.d)和kill命令杀死进程时,尽管守护程序依赖于MySQL,MySQL服务器在备份完成之前被关闭了(导致我的日志中出现SQL异常)。原因当然是kill只是发送了一个停止进程的信号。
从我的sysv脚本中,我怎样可以同步地停止正在运行的Spring Boot Tomcat服务器?
2个回答

1
如果您包含了spring-boot-starter-actuator,那么它会提供一个用于管理的REST端点。其中之一是/shutdown。访问该端点,您将获得所有资源的受控关闭,这将确保调用@PreDestroy。由于默认启用此功能可能存在危险,因此要使用它,您需要将以下内容添加到您的application.properties文件中:
endpoints.shutdown.enabled=true

当然,一旦您暴露了该端点,您需要确保应用了一点点安全性,以防止任何人关闭您的服务器。
另外,您可能会发现我对Spring Boot application as a Service的回答很有用,我提供了一个完整的init.d脚本代码,可以利用这个。

1
作为“/shutdown”端点的替代方案,Actuator还拥有一个 ApplicationPidListener (默认情况下未启用),您可以使用它来创建pid文件(通常在“init.d”样式脚本中使用,以在停止进程时杀死它)。 JVM应该响应kill(sigint),Spring将优雅地关闭。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接