2016-06-16 4 views
1

私たちのプロセッサはリストを返します(実質的にはList<List<?>>を渡します)。ItemWriterです。ここで、JdbcBatchItemWriterは、項目instanceof Listを処理するようにプログラムされていないことがわかりました。我々はまた、項目instanceof Listを処理することを観察した。カスタムItemSqlParameterSourceProviderを書く必要があります。しかし、悲しいことに、それはSqlParameterSourceを返すということです。これは1つのオブジェクトしか扱えず、再びListを扱うことができません。したがって、誰かがJdbcBatchItemWriterのリストのリストを処理する方法を理解するのを助けることができますか?リストリストにItemWriterを使用

答えて

6

通常、デザインパターンは次のとおりです。

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

プロセッサがList<Object>を返している場合、あなたはList<List<Object>>を期待するあなたのライターを必要としています。

あなたは次のようになりますItemWriterに代理人としてあなたJdbcBatchItemWriterをラップすることによってこれを行うことができます:

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

関連する問題