Spring 集成调用 Spring Batch

Posted

技术标签:

【中文标题】Spring 集成调用 Spring Batch【英文标题】:Spring Integration Invoking Spring Batch 【发布时间】:2017-06-12 15:46:26 【问题描述】:

如果其他人已经解决了这种模式,只是寻找一些信息。我想一起使用 Spring Integration 和 Spring Batch。这两个都是 SpringBoot 应用程序,理想情况下,我希望将它们和它们各自的配置分开,所以它们都是它们自己的可执行 jar。我在他们自己的进程空间中执行它们时遇到问题,我相信我想要,除非有人可以说服我,否则每个人都像他们自己的 Spring Boot 应用程序一样运行,并使用自己的配置文件和属性初始化自己。我遇到的麻烦是从我的 SpringIntegration 项目中调用我的 SpringBatch 项目中的作业。起初我无法从批处理项目中加载属性,所以我意识到我需要将 spring.active.profiles 作为作业参数传递,这似乎解决了这个问题。但是 Spring Boot Batch 应用程序中还有其他一些东西没有正确加载,比如 schema-platform.sql 文件,数据库没有被初始化等等。

在首次启动作业时,我可能希望响应返回到 Spring Integration 以获取有关作业状态的一些消息。有时我可能想在没有 Spring Integration 启动工作的情况下运行工作,但仍然利用将状态发送回 Spring Integration 项目提供其在频道上的监听或其他东西。

我已经查看了很多 Spring 示例,但还没有找到我的确切场景,大多数都是在同一个项目中的两个依赖项,所以也许我正在做一些不可能的事情,但我确定我'我只是在 Spring 配置中遗漏了一些东西。

我的问题/问题是:

我不希望 Spring Integration 项目知道 SpringBatch 配置的任何信息,除了它开始的工作。我找到了一种在不加载整个批处理配置的情况下对 Job Bean 进行引用的好方法。 我应该将这两个项目分开还是将它们结合起来更好,因为我在两者之间有双向通信。 应如何从集成项目启动作业。我们将 spring-batch-integration 项目与 JobLaunchRequest 和 JobLauncher 一起使用。这似乎在与 Spring Integration 项目相同的过程中运行它,我错过了很多 SpringBootBatch 项目初始化 我是否应该改用 CommandLineRunner 来强制它进入另一个进程。 SpringApplication.run(BatchConfiguration.class) 是答案吗?

寻找一些通用项目配置设置来满足这些要求。

【问题讨论】:

如果你有 2 个独立的项目,你需要一些通信机制,比如它们之间的队列。如果你不这样做,你一定会将它们作为一个单一的工件。您可以将 JobLaunchRequest 实例放在一个队列中,该队列在 Spring Batch 端读取(可能使用 Spring Integration,因此您仍然需要批处理端的一部分)来启动作业。 所以这听起来像是真正解耦环境,我有一个 Spring Boot Spring Integration 项目(又名 ProjectA)和一个 Spring Boot Spring Batch 环境(带有嵌入式 Spring Integration 项目)来启动作业(项目B)。 ProjectA 在这种情况下非常轻量级,它只知道 SpringIntegration 配置、文件轮询和需要发送到 ProjectB 的 spring.active.profiles。我假设这是我发送的包含这些批次特定参数的 Spring 消息。 从我的测试中,即使我传递了活动配置文件和其他作业参数(例如 inputFile=myfile.xt),我也无法让 Batch 项目在启动时识别它们。 为什么会这样?它正在启动作业而不是启动容器,因此传递活动配置文件不会有太大作用。 【参考方案1】:

Spring Cloud Data Flow 与 Spring Cloud Task 的结合完全符合您的要求。它在您选择的平台上启动 Spring Cloud Task 应用程序(可以包含批处理作业)作为新进程。我鼓励您在这里查看该项目:http://cloud.spring.io/spring-cloud-dataflow/

【讨论】:

确实是在寻找 Spring Integration 和 Spring Batch 的解决方案,并不想添加其他层和技术,但我会检查一下。

以上是关于Spring 集成调用 Spring Batch的主要内容,如果未能解决你的问题,请参考以下文章

spring batch ftp 集成超时错误 - 使用 spring-boot/spring-batch 进行 ETL

Spring Batch - Spring 集成

使用 Spring Batch 依次链接两个作业的最佳方法

RemoteChunking 中的 Spring Batch 集成超时

将 Spring Batch Admin 与另一个 JPA 持久性集成到 Spring Boot Web 应用程序中

Spring Batch -单元测试