Невозможно использовать CompositeItemWriter: ItemWriter не является ItemStream

У меня есть следующий код

@Bean
public JdbcBatchItemWriter<QuotationDto> writer1() {
    return new JdbcBatchItemWriterBuilder<QuotationDto>()
            .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
            .sql("INSERT INTO ...")
            .dataSource(dataSource)
            .build();
}

@Bean
public JdbcBatchItemWriter<QuotationDto> writer2() {
    return new JdbcBatchItemWriterBuilder<QuotationDto>()
            .itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
            .sql("INSERT INTO ...")
            .dataSource(dataSource)
            .build();
}

@Bean
public CompositeItemWriter<QuotationDto> compositeItemWriter() {
    CompositeItemWriter writer = new CompositeItemWriter();
    writer.setDelegates(Arrays.asList(writer1(), writer2()));
    return writer;
}

@Bean
public Step step1() {
    return stepBuilderFactory.get("step1")
            .<QuotationDto, QuotationDto>chunk(5)
            .reader(reader())
            .processor(processor())
            .writer(compositeItemWriter())
            .stream(writer1())
            .stream(writer2())
            .build();
}

Я получаю ошибку IntelliJ при установке writer1 в качестве потока, потому что id не реализует ItemStream.

Что я делаю не так? У кого-нибудь есть решения? Я не нахожу так много информации о конфигурации составного писателя на основе Java.

1 ответ

JdbcBatchItemWriter не реализует ItemStream поэтому его нельзя использовать в качестве потока на этапе, ориентированном на фрагменты.

Если вы хотите составить два модуля записи элементов JDBC, вы можете создать настраиваемый модуль записи элементов, который делегирует JdbcTemplate. Вот краткий пример:

class MyItemWriter implements ItemWriter<QuotationDto> {

    private JdbcTemplate jdbcTemplate;

    public MyItemWriter(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public void write(List<? extends QuotationDto> items) throws Exception {
        for (QuotationDto dto : items) {
            // use jdbcTemplate to batch insert items.
            // can do multiple inserts here, they will be part of
            // the same transaction driven by Spring Batch
        }
    }
}
Другие вопросы по тегам