我们正在使用Spring Batch进行一些处理,通过Reader读取一些ID,我们希望通过处理器将它们作为“块”处理,然后写入多个文件。但是处理器接口一次只允许处理一个项目,我们需要进行批量处理,因为处理器依赖于第三方并且不能为每个项目调用服务。
我看到我们可以为'chunk'中涉及的所有Reader-Processor-Writers创建Wrappers来处理List<>并委托一些具体的读者/处理器/作者。但这对我来说似乎并不好。像这样:
<batch:chunk reader="wrappedReader" processor="wrappedProcessor" writer="wrappedWriter"
commit-interval="2"/>
是否有“分块”选项可以在处理器之前进行分块?而不是在作家之前。
干杯,
答案 0 :(得分:1)
由于修改整个Spring Batch机制以一次处理多个项目似乎非常复杂,我建议您将第三方处理移动到一个实际上可以同时处理一大块项目的编写器。
由于您显然需要维护当前的作者,因此您只需使用CompositeItemWriter
代表2个(或更多)代理:您的新自定义ItemWriter
和当前代理。定义的顺序很重要,因为它将是它们被调用的顺序。
<强>更新强>
由于在ItemWriter
中使用2个不同的CompositeItemWriter
不允许您在第二个中保留第一个的修改,您还可以使用ItemWriteListener
。
通过实施方法beforeWrite
,您可以在写入之前用实际的块调用您的第三方:
@Override
public void beforeWrite(List<? extends T> items) {
//Third party call on item chunk
}
答案 1 :(得分:1)
我建议您重新配置ItemReader
以返回需要处理的“块”,因为这实际上是您正在处理的“项目”。