如何在没有 xml 的 Java 配置中使用具有不同数据和两个 JdbcBatchItemWritter 的 Spring 批处理 CompositeItemWriter

Sop*_*kar 6 spring-batch spring-boot

以下是将在作业中初始化的步骤代码。

@Bean
public Step stepOne() {
    return stepBuilderFactory.get("stepOne")
            .<EmployeeDTO, EmployeeDTO> chunk(1)
            .reader(readerOne())
            .processor(processorOne())
            .writer(compositeWriter())
            .build();
}
Run Code Online (Sandbox Code Playgroud)

下面是用于写入数据的复合写入器。

@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;
   }
}
Run Code Online (Sandbox Code Playgroud)

Mah*_*ine 11

您的配置有几个问题:

  • 您不需要write在 writer (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;
}
Run Code Online (Sandbox Code Playgroud)

2. 注册代表 CompositeItemWriter

@Bean
public CompositeItemWriter<EmployeeDTO> compositeItemWriter() {
    CompositeItemWriter<EmployeeDTO> compositeItemWriter = new CompositeItemWriter<>();
    compositeItemWriter.setDelegates(Arrays.asList(insertW(), updateW()));
    return compositeItemWriter;
}
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。