【问题标题】:Spring Batch - How to make parallel steps with one reads out of other step's writer?Spring Batch - 如何使用一个读取其他步骤的作者的并行步骤?
【发布时间】: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 不是我知道的。

标签: java spring parallel-processing spring-batch


【解决方案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 个列表),而是确定块通过更改该列表中的项目数来调整阅读器的大小。

【讨论】:

  • 你能告诉我如何像上面提到的那样一步配置多个处理器吗?
  • 这对我有帮助。我使用了你的第二种方法。
  • 不是只读取和返回一个列表,而是将这个列表拆分为多个较小的列表也是一种有效的方法。这将允许你有一个高于 1 的提交间隔?您是否有参考解释为什么 spring Integration 可能是实现这一点的另一种方式?
猜你喜欢
  • 2023-03-13
  • 1970-01-01
  • 2015-04-09
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
  • 2018-02-26
  • 1970-01-01
  • 2022-10-20
相关资源
最近更新 更多