我写了一个 Spring Boot 网络服务,它使用嵌入式tomcat 作为容器。
如果系统重新启动,我想将一些信息备份到mysql数据库。
在我的网络服务中,我使用@Scheduled()
和@PreDestroy
来运行备份。
当我用^ C停止服务器时这很顺利。
但是当我使用 sysV skript (/etc/init.d
)和kill命令终止进程时 - 即使守护进程依赖于mysql,mysql服务器也会在之前关闭备份完成(导致我的日志中出现SQL异常)。
原因当然是,kill只发送一个信号来停止进程。
我如何(从我的sysv skript)同时停止正在运行的spring boot tomcat服务器?
答案 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将正常关闭。