3

我编写了一个使用嵌入式 tomcat作为容器的Spring Boot Web 服务。

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

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

当我用 ^C 停止服务器时,一切顺利。

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

这样做的原因当然是 kill 只发送一个信号来停止进程。

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

4

2 回答 2

1

作为“/shutdown”端点的替代方案,Actuator 还具有一个ApplicationPidListener(默认情况下未启用),您可以使用它来创建 pidfile(通常在“init.d”样式脚本中用于在您想要终止进程时终止进程)停下来)。JVM 应该响应 kill (sigint) 并且 Spring 将正常关闭。

于 2014-05-08T14:41:41.950 回答
1

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

endpoints.shutdown.enabled=true

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

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

于 2014-05-08T14:05:26.273 回答