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

Posted

技术标签:

【中文标题】基于 Spring Boot (Tomcat) 的应用程序作为守护进程 - 如何停止?【英文标题】:Spring Boot (Tomcat) based application as daemon - howto stop? 【发布时间】:2013-11-30 17:55:10 【问题描述】:

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

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

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

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

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

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

我如何(从我的 sysv 脚本)同步停止正在运行的 Spring Boot Tomcat 服务器?

【问题讨论】:

【参考方案1】:

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

endpoints.shutdown.enabled=true

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于基于 Spring Boot (Tomcat) 的应用程序作为守护进程 - 如何停止?的主要内容,如果未能解决你的问题,请参考以下文章

Https系列之二:https的SSL证书在服务器端的部署,基于tomcat,spring boot

Https系列之二:https的SSL证书在服务器端的部署,基于tomcat,spring boot

spring boot war布署tomcat异常处理

使用 IntelliJ 部署启用嵌入式 tomcat 的 spring-boot 应用程序

如何让 Spring Boot 应用程序在 tomcat 失败时退出

Tomcat 中 Spring Boot War 文件的外部化配置