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

时间:2013-11-17 16:38:33

标签: init.d spring-boot sysv

我写了一个 Spring Boot 网络服务,它使用嵌入式tomcat 作为容器。

如果系统重新启动,我想将一些信息备份到mysql数据库。

在我的网络服务中,我使用@Scheduled()@PreDestroy来运行备份。

当我用^ C停止服务器时这很顺利。

但是当我使用 sysV skript /etc/init.d)和kill命令终止进程时 - 即使守护进程依赖于mysql,mysql服务器也会在之前关闭备份完成(导致我的日志中出现SQL异常)。

原因当然是,kill只发送一个信号来停止进程。

我如何(从我的sysv skript)同时停止正在运行的spring boot tomcat服务器?

2 个答案:

答案 0 :(得分:1)

如果包含 spring-boot-starter-actuator ,则会为管理提供REST端点。提供的端点之一是/shutdown。通过点击该端点,您将获得所有资源的受控关闭,从而确保将调用@PreDestroy。由于默认情况下启用可能很危险,因此要使用它,您需要将以下内容添加到application.properties文件中:

endpoints.shutdown.enabled=true

当然,一旦你暴露了这个端点,就需要确保应用了一点点安全措施,以防止任何人关闭你的服务器。

在相关的说明中,您可能会发现Spring Boot application as a Service的答案很有用,我提供了完整的init.d脚本的代码,该脚本使用了这个。

答案 1 :(得分:1)

作为" / shutdown"的替代品端点Actuator还有一个ApplicationPidListener(默认情况下未启用),您可以使用它创建一个pid文件(通常用于" init.d"样式脚本,以便在您需要时终止进程阻止它)。 JVM应该响应kill(sigint),Spring将正常关闭。