本文介绍了如何将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配置中的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

05-21 17:22