在 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上运行的步骤