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

标签 java spring spring-mvc spring-boot war

我有一个打包为 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/

相关文章:

java - 设计和测试此类的正确方法

java - 来自包含字符像素宽度的 HashMap 的像素完美自动换行

java - spring 计划任务 : from XML to annotation

java - Spring Security 初始化在 mvcContentNegotiationManager 上抛出 UnsatisfiedDependencyException

java - 如何处理@Transactional中的提交和回滚?

java - dofilter 没有给出 pdf 作为响应输出

Java - 在枚举中使用 "this"?

java - 获取 JTextPane 中选定文本的字体大小

java - JpaRepository findAll() 返回空结果

java - 如何仅在属性为 false 或未定义时加载 bean?