Spring 一次处理多个项目的批处理
Spring Batch to process multiple Items at once
我们正在使用 Spring 批处理进行一些处理,通过 Reader 读取一些 ID,我们希望通过处理器将它们处理为 'chunks',然后写入多个文件。但是处理器接口一次只允许处理一个项目,我们需要进行批量处理,因为处理器依赖于第三方并且为每个项目调用服务不是一个选项。
我看到我们可以为 'chunk' 中涉及的所有 Reader-Processor-Writer 创建包装器来处理 List<> 并委托给一些具体的 reader/processor/writer。但这对我来说似乎并不好。像这样:
<batch:chunk reader="wrappedReader" processor="wrappedProcessor" writer="wrappedWriter"
commit-interval="2"/>
是否有 'chunking' 选项允许在处理器之前分块?而不是在 Writer 之前。
干杯,
由于修改整个 Spring 批处理机制以一次处理多个项目似乎真的很复杂,我建议您将第三方处理转移到实际上可以一次处理一大块项目的编写器。
由于您显然需要维护当前的编写器,因此您可以简单地使用带有 2 个(或更多)委托的 CompositeItemWriter
:您的新自定义 ItemWriter
和当前的自定义。定义的顺序很重要,因为这将是它们被调用的顺序。
更新
由于在 CompositeItemWriter
中使用 2 个不同的 ItemWriter
不会让您在第二个中保留对第一个的修改,因此您也可以使用 ItemWriteListener
。
通过实现方法 beforeWrite
,您可以在写入之前用实际块调用第三方:
@Override
public void beforeWrite(List<? extends T> items) {
//Third party call on item chunk
}
我建议将您的 ItemReader
重新配置为 return 需要处理的 "chunk",因为这确实是您正在处理的 "item"。
我们正在使用 Spring 批处理进行一些处理,通过 Reader 读取一些 ID,我们希望通过处理器将它们处理为 'chunks',然后写入多个文件。但是处理器接口一次只允许处理一个项目,我们需要进行批量处理,因为处理器依赖于第三方并且为每个项目调用服务不是一个选项。
我看到我们可以为 'chunk' 中涉及的所有 Reader-Processor-Writer 创建包装器来处理 List<> 并委托给一些具体的 reader/processor/writer。但这对我来说似乎并不好。像这样:
<batch:chunk reader="wrappedReader" processor="wrappedProcessor" writer="wrappedWriter"
commit-interval="2"/>
是否有 'chunking' 选项允许在处理器之前分块?而不是在 Writer 之前。
干杯,
由于修改整个 Spring 批处理机制以一次处理多个项目似乎真的很复杂,我建议您将第三方处理转移到实际上可以一次处理一大块项目的编写器。
由于您显然需要维护当前的编写器,因此您可以简单地使用带有 2 个(或更多)委托的 CompositeItemWriter
:您的新自定义 ItemWriter
和当前的自定义。定义的顺序很重要,因为这将是它们被调用的顺序。
更新
由于在 CompositeItemWriter
中使用 2 个不同的 ItemWriter
不会让您在第二个中保留对第一个的修改,因此您也可以使用 ItemWriteListener
。
通过实现方法 beforeWrite
,您可以在写入之前用实际块调用第三方:
@Override
public void beforeWrite(List<? extends T> items) {
//Third party call on item chunk
}
我建议将您的 ItemReader
重新配置为 return 需要处理的 "chunk",因为这确实是您正在处理的 "item"。