Spring Batch - 如何使用一个读取其他步骤的编写器的并行步骤?

我是Spring批处理框架的新手 .

我在一个作业中创建了两个步骤(让我们称之为 Step1Step2 ) . 我想在 parallel 中运行它们 . 不仅如此, Step2's IteamReader 应该使用 Step1's ItemWriter .

换句话说,Step2的ItemReader应该等待Step1的ItemWriter写一个块 . Step1写入后,Steps2开始读取并将其传递给处理器并进一步传递 .

我的第一个问题是,它是否可以在Spring Batch中执行此操作?如果有,怎么样?

其次,如果那是不可能的,那可能是什么工作呢?

谢谢 .

回答(1)

2 years ago

您可以使用 <split/> 来一次破解它以一次运行2个步骤 . 步骤1将写入步骤2可以读取的队列 . 这里的关键是确保你的Step 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

如果你这样做,你将绕过框架通常如何工作,所以你需要将你的commit-interval设置为1(因为你只希望读者返回1个列表),而是确定你的块大小读者通过更改该列表中的项目数 .