防止来自 Spring Boot 的数据库关闭命令

Posted

技术标签:

【中文标题】防止来自 Spring Boot 的数据库关闭命令【英文标题】:Prevent database shutdown command from Spring Boot 【发布时间】:2017-10-04 09:36:40 【问题描述】:

当我运行我的 Spring Boot 应用程序(从 Intellij IDEA 中)并触发应用程序的停止、重新启动或自动重新部署时;有些东西正在向我的 HSQLDB 发出关闭命令。

我从外部终端窗口以服务器模式运行 HSQLDB (v.2.3.4)。

我重新启动或停止 Spring Boot 应用程序时的 HSQLDB 服务器日志:

[Server@4f023edb]: Initiating shutdown sequence...
[Server@4f023edb]: Shutdown sequence completed in 101 ms.
[Server@4f023edb]: 2017-05-05 21:47:01.878 SHUTDOWN : System.exit() is called next 

这当然很烦人,因为我每次重新部署应用程序时都必须手动启动 HSQLDB。如何防止这种情况发生,或解释实际发生的情况。

这似乎只发生在从 Intellij IDEA 中运行 Spring Boot 应用程序时,如果我从终端窗口启动 Spring Boot application-jar 并发出关闭 Ctrl+C kbd>,则 HSQLDB 不受影响。

【问题讨论】:

【参考方案1】:

原来我只在 Intellij IDEA 中运行时遇到此问题的原因是因为spring-boot-devtools(我的项目中包含的一个 maven 依赖项)未打包在我从终端窗口运行的应用程序 jar 中。

运行完全打包的应用程序时,开发人员工具会自动禁用。如果您的应用程序是使用 java -jar 启动的,或者它是使用特殊的类加载器启动的,那么它被认为是“生产应用程序”。将依赖项标记为可选是一种最佳实践,可以防止 devtools 被传递到使用您的项目的其他模块。 Gradle 不支持开箱即用的可选依赖项,因此您可能希望同时查看 propdeps-plugin。

spring-boot-devtools 在 Intellij IDEA 中运行应用程序时处于活动状态,并提供一个关闭挂钩,将尝试优雅地关闭数据库资源(除其他外)。

可以通过以下方式禁用关闭挂钩;

SpringApplication app = new SpringApplication(MyApplication.class);
app.setRegisterShutdownHook(false);  //This disables the shutdown hook
app.run(args);

这个解决方案解决了我的问题。

【讨论】:

以上是关于防止来自 Spring Boot 的数据库关闭命令的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 Spring Boot 守护程序/服务器应用程序立即关闭/关闭?

spring boot 微服务如何实现编排? [关闭]

Spring Boot Maven 插件 - spring-boot:run 和优雅关闭

在 Spring Boot 中使用 Copy 命令从 Postgres 导出数据

Spring Boot 在 AWS EC2 上自动关闭

Spring Boot的应用启动与关闭