2016-06-16 2 views
1

Наш процессор возвращает список (эффективно передающий List<List<?>>) на наш ItemWriter. Теперь мы заметили, что JdbcBatchItemWriter не запрограммирован для обработки элемента instanceof List. Мы также заметили, что обрабатываем элемент экземпляра List; нам нужно написать обычай ItemSqlParameterSourceProvider. Но печальная часть заключается в том, что он возвращает SqlParameterSource, который может обрабатывать только один объект и снова не способен обрабатывать список. Итак, кто-то может помочь нам понять, как обрабатывать список списков в JdbcBatchItemWriter.Использование ItemWriter со списком списков

ответ

6

Как правило, дизайн картина:

Reader -> reads something, returns ReadItem 
Processor -> ingests ReadItem, returns ProcessedItem 
Writer -> ingests List<ProcessedItem> 

Если ваш процессор возвращается List<Object>, то вам нужен писатель ожидать List<List<Object>>.

Вы могли бы сделать это, обернув вашего JdbcBatchItemWriter в качестве делегата в качестве ItemWriter, который выглядит примерно так:

public class ListUnpackingItemWriter<T> implements ItemWriter<List<T>>, ItemStream, InitializingBean { 

    private ItemWriter<T> delegate; 

    @Override 
    public void write(final List<? extends List<T>> lists) throws Exception { 
     final List<T> consolidatedList = new ArrayList<>(); 
     for (final List<T> list : lists) { 
      consolidatedList.addAll(list); 
     } 
     delegate.write(consolidatedList); 
    } 

    @Override 
    public void afterPropertiesSet() { 
     Assert.notNull(delegate, "You must set a delegate!"); 
    } 

    @Override 
    public void open(ExecutionContext executionContext) { 
     if (delegate instanceof ItemStream) { 
      ((ItemStream) delegate).open(executionContext); 
     } 
    } 

    @Override 
    public void update(ExecutionContext executionContext) { 
     if (delegate instanceof ItemStream) { 
      ((ItemStream) delegate).update(executionContext); 
     } 
    } 

    @Override 
    public void close() { 
     if (delegate instanceof ItemStream) { 
      ((ItemStream) delegate).close(); 
     } 
    } 

    public void setDelegate(ItemWriter<T> delegate) { 
     this.delegate = delegate; 
    } 

} 
+0

Отлично предложенного решения. Мы планировали сделать что-то более сложное, выполнив http://forum.spring.io/forum/spring-projects/batch/122284-how-to-write-a-list-of-items-with-a-itemwriter; но ваше решение достаточно общее. В последнем случае нам потребовалась бы большая работа. Тестирование было также громоздким. – chatanyday

+0

Очень хорошее форматирование кода, у вас есть шаблон для этого? – Serge

+0

Возможно, более эффективно создать список и выполнить запись один раз. – Serge

Смежные вопросы