Spring Batch - 如何使用一个读取其他步骤的作者的并行步骤?
Posted
技术标签:
【中文标题】Spring Batch - 如何使用一个读取其他步骤的作者的并行步骤?【英文标题】:Spring Batch - How to make parallel steps with one reads out of other step's writer? 【发布时间】:2018-06-20 11:25:09 【问题描述】:我对 Spring 批处理框架很陌生。
我在一项工作中创建了 2 个步骤(我们称它们为 Step1 和 Step2)。我想并行运行它们。不仅如此,Step2 的IteamReader 应该使用Step1 的ItemWriter。
也就是说,Step2 的 ItemReader 应该等待 Step1 的 ItemWriter 写入一个 chunk。 Step1 写入后,Steps2 开始读取并将其传递给其处理器并进一步传递。
我的第一个问题是,在 Spring Batch 中是否可以做到这一点?如果是,怎么做?
其次,如果这不可能,有什么办法可以解决?
谢谢。
【问题讨论】:
并行? afaik,不可能,这些步骤按照您在配置中设置的顺序进行。 您是否检查过github.com/j-easy/easy-batch 作为替代方案? @questionare 它似乎没有提供我正在寻找的功能。 @Stultuske 没办法让它工作? @gohil90 不是我知道的。 【参考方案1】:您可以使用<split/>
来破解它,一次运行 2 个步骤。第 1 步将写入第 2 步可以读取的队列。这里的关键是确保您的第 2 步的阅读器在MessageConsumer
上有适当的超时,以便它可以等待足够长的时间让第 1 步将一个块写入队列。
<split id="splitStep" task-executor="asyncTaskExecutor" >
<flow>
Step 1: reader -> processor -> writer (to queue)
</flow>
<flow>
Step 2: reader (from queue) -> processor -> final writer
</flow>
</split>
也就是说,你有什么理由不能只使用复合处理器吗?
Step 1: reader -> processor 1 -> processor 2 -> writer
或者更好的是,你需要分块吗?它可能是 Spring Integration 或其他东西的更好用例。
如果您确实需要分块,则可以改为破解您的阅读器以返回 List
,然后使用复合处理器链接整个块的转换。
Reader: reads source, returns List<SourceItem>
Processor 1: List<SourceItem> in, perform transformations, List<TransformedItem> out
Processor 2: List<TransformedItem> in, additional transformations, List<FinalItem> out
Writer: List<List<FinalItem>> in, unpack the list, write to final destination
如果您要这样做,您将绕过框架通常的工作方式,因此您需要将提交间隔设置为 1(因为您只希望阅读器返回 1 个列表),而是确定块通过更改该列表中的项目数来调整阅读器的大小。
【讨论】:
你能告诉我如何像上面提到的那样一步配置多个处理器吗? docs.spring.io/spring-batch/trunk/reference/html/… 这对我有帮助。我使用了你的第二种方法。 不是只读取和返回一个列表,而是将这个列表拆分为多个较小的列表也是一种有效的方法。这将允许你有一个高于 1 的提交间隔?您是否有参考解释为什么 spring Integration 可能是实现这一点的另一种方式?以上是关于Spring Batch - 如何使用一个读取其他步骤的作者的并行步骤?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Batch 中分别读取平面文件头和正文
Spring Batch中如何读取多个CSV文件合并数据进行处理?
如何在 Spring Batch 中使用 Spring 事务支持
Spring Batch - 创建两个数据源以及如何自定义使用其他属性