本文介绍了如何将Spring Batch CompositeItemWriter用于不同数据、有两个JdbcBatchItemWritter以及在没有XML的Java配置中的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
下面是将在作业中初始化的步骤代码。
@Bean
public Step stepOne() {
return stepBuilderFactory.get("stepOne")
.<EmployeeDTO, EmployeeDTO> chunk(1)
.reader(readerOne())
.processor(processorOne())
.writer(compositeWriter())
.build();
}
下面是用于写入数据的复合编写器。
@Bean
public CompositeItemWriter<EmployeeDTO> compositeWriter(){
return new CompositeWriter();
}
public class CompositeWriter extends CompositeItemWriter<EmployeeDTO> {
@Autowired
private DataSource dataSource;
List<EmployeeDTO> insert;
List<EmployeeDTO> update;
@Override
public void write(List<? extends EmployeeDTO> arg0) throws Exception {
CompositeItemWriter<EmployeeDTO> compositeItemWriter = new CompositeItemWriter<>();
compositeItemWriter.setDelegates(Arrays.asList(insertW(),updateW()));
}
private JdbcBatchItemWriter<EmployeeDTO> insertW() throws Exception{
JdbcBatchItemWriter<EmployeeDTO> batchItemWriter = new JdbcBatchItemWriter<>();
batchItemWriter.setDataSource(dataSource);
batchItemWriter.setSql("");
batchItemWriter.write(insert);
return batchItemWriter;
}
private JdbcBatchItemWriter<EmployeeDTO> updateW() throws Exception{
JdbcBatchItemWriter<EmployeeDTO> batchItemWriter = new JdbcBatchItemWriter<>();
batchItemWriter.setDataSource(dataSource);
batchItemWriter.setSql("");
batchItemWriter.write(update);
return batchItemWriter;
}
}
推荐答案
您的配置有几个问题:
- 不需要调用编写器上的
write
方法(batchItemWriter.write(insert)
和batchItemWriter.write(update)
),Spring Batch会调用的。 - 不需要将
CompositeItemWriter
子类化。您可以创建一个实例,并在其中注册委托编写器。 - 委派编写器需要在该步骤中注册为流。
以下是如何处理您的案例:
1.定义委派编写器
@Bean
public JdbcBatchItemWriter<EmployeeDTO> insertW() throws Exception{
JdbcBatchItemWriter<EmployeeDTO> batchItemWriter = new JdbcBatchItemWriter<>();
batchItemWriter.setDataSource(dataSource);
batchItemWriter.setSql("");
return batchItemWriter;
}
@Bean
public JdbcBatchItemWriter<EmployeeDTO> updateW() throws Exception{
JdbcBatchItemWriter<EmployeeDTO> batchItemWriter = new JdbcBatchItemWriter<>();
batchItemWriter.setDataSource(dataSource);
batchItemWriter.setSql("");
return batchItemWriter;
}
2.在CompositeItemWriter
中注册委派@Bean
public CompositeItemWriter<EmployeeDTO> compositeItemWriter() {
CompositeItemWriter<EmployeeDTO> compositeItemWriter = new CompositeItemWriter<>();
compositeItemWriter.setDelegates(Arrays.asList(insertW(), updateW()));
return compositeItemWriter;
}
3.在步骤中将委托注册为流(如果它们实现了ItemSteam)
@Bean
public Step stepOne() {
return stepBuilderFactory.get("stepOne")
.<EmployeeDTO, EmployeeDTO> chunk(1)
.reader(readerOne())
.processor(processorOne())
.writer(compositeItemWriter())
.stream(insertW())
.stream(updateW())
.build();
}
希望这对您有帮助。
这篇关于如何将Spring Batch CompositeItemWriter用于不同数据、有两个JdbcBatchItemWritter以及在没有XML的Java配置中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!