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 个步骤(我们称它们为 Step1Step2)。我想并行运行它们。不仅如此,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 - 创建两个数据源以及如何自定义使用其他属性

Spring-batch学习总结—ItemReader普通文件,数据库,XML,多文件数据读取

Spring Batch 并行读取数据库