Spring批处理中的多个项目编写者

我正在编写一个Spring批处理,我正在读取一大块数据,处理它然后我希望将这些数据传递给2个编写器。 一个编写器只是更新数据库,而第二个编写器将写入csv文件。

我打算编写自己的自定义编写器并在customItemWriter中注入两个itemWriters,并在customItemWriter的write方法中调用两个item编写器的write方法。 这种方法是否正确? 是否有任何符合我要求的ItemWriter实现?

提前致谢

您可以使用Spring的CompositeItemWriter并将其委托给所有作者。
这是一个配置示例 。

您不必像示例那样使用xml。 如果其余代码使用注释,则只需执行以下操作即可。

public ItemWriter writerOne(){ ItemWriter writer = new ItemWriter(); //your logic here return writer; } public ItemWriter writerTwo(){ ItemWriter writer = new ItemWriter(); //your logic here return writer; } public CompositeItemWriter compositeItemWriter(){ CompositeItemWriter writer = new CompositeItemWriter(); writer.setDelegates(Arrays.asList(writerOne(),writerTwo())); return writer; } 

你是对的。 SB非常基于委托,因此使用CompositeItemWriter是您需要的正确选择。

根据您的需要,另一个选项是扩展Writer类并在那里添加function。 例如,我有一个项目,我将扩展HibernateItemWriter,然后重写write(List items)。 然后我将我正在编写的对象和sessionFactory一起发送到Writer的doWrite方法:doWrite(sessionFactory,filteredRecords)。

所以在上面的例子中,我可以写入扩展类中的csv文件,然后HibernateItemWriter将写入数据库。 显然,这可能不是这个例子的理想选择,但对于某些情况,这是一个不错的选择。

Java Config方式SpringBatch4

 @Bean public Step step1() { return this.stepBuilderFactory.get("step1") .chunk(2) .reader(itemReader()) .writer(compositeItemWriter()) .stream(fileItemWriter1()) .stream(fileItemWriter2()) .build(); } /** * In Spring Batch 4, the CompositeItemWriter implements ItemStream so this isn't * necessary, but used for an example. */ @Bean public CompositeItemWriter compositeItemWriter() { List writers = new ArrayList<>(2); writers.add(fileItemWriter1()); writers.add(fileItemWriter2()); CompositeItemWriter itemWriter = new CompositeItemWriter(); itemWriter.setDelegates(writers); return itemWriter; }