2013-03-11 49 views
1

我遇到以下問題:我有一個文件,其中的每行都會導致一個或多個項目寫入數據庫。我需要從另一個系統進行查找,以確定需要寫入多少項目。每條產生於單一行的項目必須使用項目處理器鏈進行轉換,最後寫入數據庫中的多個表格。Spring批次項目拆分器

因爲每個項目都需要寫入多個表格,所以每個項目都必須在自己的事務中。正因爲如此,我不能只有一個ItemProcessor<Foo, List<Bar>>來處理它。在這種情況下 - 即使在commit-interval爲1的情況下 - 我最終會在同一交易中獲得多個項目。

我已經看過this堆棧溢出問題了。由於交易問題,接受的答案對我沒有幫助。關於使用Spring集成分離器的其他答案聽起來很有趣。但是,它並沒有給出很多細節。如何將讀卡器的輸出定義爲通道輸入?我將如何定義一個輸出頻道到我的項目作家?我怎麼還能在每個新分割的物品上運行物品處理器鏈?

我一直無法在spring批處理作業中使用分隔符找到任何示例。任何建議,將不勝感激。

+0

爲什麼你不使用ClassifierCompositeItemWriter http://static.springsource.org/spring-batch/apidocs/org/springframework/batch/item/support/ClassifierCompositeItemWriter.html – 2013-03-12 11:21:51

+0

@SerkanArıkuşu這裏沒有什麼需要分類。一切都會發生在同一個作家身上。我相信一個複合項目編寫器用於讓某些項目根據分類器轉到某個項目編寫者。如果我錯過了什麼,請告訴我。 – 2013-03-13 13:27:02

+0

你有沒有在這方面找到解決方案?我確實有完全相同的情況。 – Marseld 2017-03-22 00:00:19

回答

0

與FlatFileItemReader相同的問題,雖然減去交易問題。 解決這一問題的那樣:

public class FlatFileItemListWriter<T> extends FlatFileItemWriter<T> { 

    /** 
    * {@inheritDoc} 
    * 
    * @see org.springframework.batch.item.file.FlatFileItemWriter#write(java.util.List) 
    */ 
    @Override 
    @SuppressWarnings("unchecked") 
    public void write(List<? extends T> itemsLists) throws Exception { 
     List<T> items = new ArrayList<T>(); 
     for (Object item : itemsLists) { 
      items.addAll((List<T>) item); 
     } 
     super.write(items); 
    } 

} 

這樣一來,FlatFileItemWriter涉及的名單,如果我的處理器沒有產生列出那就得的方式。