gpt4 book ai didi

java - 在 Spring Boot Web 应用程序中运行脚本

转载 作者:搜寻专家 更新时间:2023-10-31 20:09:22 24 4
gpt4 key购买 nike

我有一个打包为 WAR 文件的 Spring Boot Web 应用程序,我希望能够按需运行某些任务(脚本或命令)。例如:

  • 初始化数据库模式
  • 以编程方式为数据库播种
  • 新版本应用程序需要时进行数据迁移(移动文件、数据库操作等)
  • 验证存储文件和数据库内容之间的数据完整性

如果这些“命令”可以访问与 Web 应用程序本身相同的 bean(服务、DAO)和模型,那么它们将更容易实现。我希望我必须在某个地方创建一个 Spring 应用程序上下文才能发生这种情况。我还更愿意将这些命令与应用程序的其余部分打包在一起,以便与它一起进行测试并易于部署。

本质上,我想知道如何实现类似于 Laravel's artisan commands 的东西(PHP)。

我读过关于在 WAR 中运行一个类的文章 herehere .我正在寻找打包和运行命令的“Spring 方式”。我必须整合 Spring Batch jobs 吗?为了这?据我了解,Spring Batch 适用于可以分成多个批处理的较大工作负载。我应该硬着头皮将命令放在引用第一个的第二个单独的 Maven 模块中吗?

更新

我实现了一个 ApplicationRunner (感谢 Stefan!)查看它们是如何工作的,发现它们在 Spring 应用程序上下文刷新后运行。这意味着整个 Web 应用程序在运行器执行之前就已初始化并处于 Activity 状态。这包括 MVC 端点映射器和配置中定义的计划任务。虽然这绝对有用,但我需要在所有这些都不活动时运行命令,因为它可能会与命令发生冲突(尤其是命令运行期间的 transient 数据状态)。

更新2

我只需要创建另一个可执行 jar,它使用 CommandLineRunner 创建 Spring Boot 应用程序。如果我使用 3 个模块,这可以引用 Web 应用程序中的所有 bean:

  1. spring“服务”bean 模块
  2. 网络应用模块
  3. 命令行运行器模块

最佳答案

您可以使用 ApplicationRunner见spring boot application runner .运行程序在应用程序启动后执行,您可以访问 spring 上下文。

CommandLineRunner 类正是用于此目的。另见 How does a Spring Boot console based application work?

关于java - 在 Spring Boot Web 应用程序中运行脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39581175/

24 4 0
文章推荐: Java ExecutorService - 如果 awaitTermination() 失败怎么办?
文章推荐: java - 为什么 UnaryFunction 可以转换为 UnaryFunction