在 Spring Boot 上运行 Spring Batch (JSR-352) 应用程序

Posted

技术标签:

【中文标题】在 Spring Boot 上运行 Spring Batch (JSR-352) 应用程序【英文标题】:Run Spring Batch (JSR-352) application on Spring Boot 【发布时间】:2019-10-14 00:59:03 【问题描述】:

我有一个符合 JSR-352 的简单 Spring Batch 应用程序。

我需要将它部署为 Spring Cloud Data Flow 服务器上的托管任务。据我所知 - 为了能够将其部署为任务,我需要将此应用程序转换为 Spring Boot 应用程序。

我尝试添加 Spring Boot 依赖项和 Main 类,但是当我启动应用程序时它没有运行 Batch 作业。

主类

@SpringBootConfiguration
@EnableAutoConfiguration
@EnableBatchProcessing
public class Application 

    public static void main(String[] args) 
        SpringApplication.run(Application.class, args);
    


批处理文件创建于

META-INF/batch-jobs/myjob.xml

当我在主类中使用 JobOperator 启动作业时它可以工作(没有 Spring Boot)。

将它作为 Spring Boot 应用程序运行我缺少什么?

【问题讨论】:

【参考方案1】:

您缺少@EnableTask 注释。这样,您的批处理作业将作为短期应用程序运行。换句话说,只要您的 XML 中的业务逻辑需要运行,应用程序就会运行,它会优雅地关闭并释放资源。

请克隆并试用Spring Cloud Task samples [参见:BatchJobApplication]。所有这些都应该在 SCDF 中按原样工作。

【讨论】:

我知道@EnableTask 并且已经尝试过了。问题是 Spring Boot 应用程序如何识别批处理 XML 并运行它。另外,我尝试在 Config 类中使用 JobOperator 运行作业,但是 SCDF 服务器没有将任务识别为批处理! @adesai 如果您的作业配置是在 XML 文件中定义的,您需要告诉 Spring Boot 在哪里可以找到该文件并使用 @ImportResource 将其导入,请参见此处:docs.spring.io/spring-boot/docs/current/reference/htmlsingle/…。 @Mahmoud Ben Hassine - 我尝试过使用@ImportResource,它使用Caused by: org.xml.sax.SAXParseException: cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration can be found for element 'job'. 提供堆栈跟踪请记住这个XML 文件是基于JSR-352 的批处理文件而不是Spring beans XML 文件。正如我在之前的评论中提到的,它适用于JobOperator - BatchRuntime.getJobOperator.start(jobId, null),但 SCDF 并未将任务识别为批处理任务。我想在启动时自动加载它。 好吧,那是另一回事。 JSR 352 作业描述符应放在META-INF/batch-jobs(参见Oracle docs)而不是META-INF/batch-job 下。请注意文件夹名称中缺少的“s”。 @Mahmoud Ben Hassine - 为错字道歉。它一直是批处理作业。您认为可以在 SCDF 服务器上部署 JSR-352 批处理应用程序作为“批处理作业”吗?

以上是关于在 Spring Boot 上运行 Spring Batch (JSR-352) 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot 上运行 Spring Batch (JSR-352) 应用程序

spring boot项目打包成war并在tomcat上运行的步骤

spring boot项目打包成war并在tomcat上运行的步骤

如何在端口 443 上运行 Spring Boot

spring boot spring cloud 打成jar包在Windows或者Linux上运行的几种方式

spring boot spring cloud 打成jar包在Windows或者Linux上运行的几种方式