【问题标题】:Run Spring Batch (JSR-352) application on Spring Boot在 Spring Boot 上运行 Spring Batch (JSR-352) 应用程序
【发布时间】: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 应用程序运行我缺少什么?

【问题讨论】:

    标签: spring-boot spring-batch spring-cloud-dataflow jsr352


    【解决方案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 批处理应用程序作为“批处理作业”吗?
    猜你喜欢
    • 2014-12-01
    • 1970-01-01
    • 2015-05-19
    • 2021-05-31
    • 2017-04-20
    • 2019-02-07
    • 2018-05-13
    • 2016-11-14
    • 2023-03-16
    相关资源
    最近更新 更多