Как использовать Spring batch CompositeItemWriter с разными данными, имеющими два JdbcBatchItemWritter и в конфигурациях Java без xml - PullRequest
0 голосов
/ 24 ноября 2018

Ниже приведен код шага, который будет инициализирован в задании.

@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;
   }
}

1 Ответ

0 голосов
/ 26 ноября 2018

Есть несколько проблем с вашей конфигурацией:

  • Вам не нужно вызывать метод 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.Зарегистрируйте делегатов как потоки на шаге

@Bean
public Step stepOne() {
    return stepBuilderFactory.get("stepOne")
            .<EmployeeDTO, EmployeeDTO> chunk(1)
            .reader(readerOne())
            .processor(processorOne())
            .writer(compositeItemWriter())
            .stream(insertW())
            .stream(updateW())
            .build();
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...