【发布时间】: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 项目在启动时识别它们。
-
为什么会这样?它正在启动作业而不是启动容器,因此传递活动配置文件不会有太大作用。
标签: spring-boot spring-integration spring-batch