【发布时间】:2021-05-08 17:47:45
【问题描述】:
我正在编写一个Spring Batch 应用程序,其工作流程如下:
- 读取
A类型的一些项目(使用FlatFileItemReader<A>)。 - 处理项目,将其从
A转换为B。 - 写入
B类型的已处理项目(使用JdbcBatchItemWriter<B>) - 最终,我应该调用外部服务(一个 RESTful API,但它可以是
SimpleMailMessageItemWriter<A>)使用来自源类型的数据A。
如何配置这样的工作流程?
到目前为止,我找到了以下解决方法:
- 配置一个
CompositeItemWriter<B>,它代表:- 实际
ItemWriter<B> - 自定义
ItemWriter<B>实现将B转换回A,然后写入A
- 实际
但这是一个繁琐的解决方案,因为它迫使我:
- 重复处理逻辑:从
A到B再返回。 - 在
B内部偷偷隐藏源对象A的一些属性,污染域模型。
注意:由于我的A 的自定义项目写入器需要调用外部服务,所以我想在B 写入成功后执行此操作。
这里是批量配置代码的相关部分。
@Bean
public Step step(StepBuilderFactory steps, ItemReader<A> reader, ItemProcessor<A, B> processor, CompositeItemWriter<B> writer) {
return steps.get("step")
.<A, B>chunk(10)
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
@Bean
public CompositeItemWriter<B> writer(JdbcBatchItemWriter<B> jdbcBatchItemWriter, CustomItemWriter<B, A> customItemWriter) {
return new CompositeItemWriterBuilder<B>()
.delegates(jdbcBatchItemWriter, customItemWriter)
.build();
}
【问题讨论】:
标签: spring spring-batch