Есть несколько проблем с вашей конфигурацией:
- Вам не нужно вызывать метод
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();
}
Надеюсь, это поможет.