2015-04-27 174 views
1

我創建我的自定義ItemReader:如何初始化自定義ItemReader?

@Component("pricereader") 
public class MyItemReader implements ItemReader<Price>{ 

@Override 
public Price read() throws Exception, UnexpectedInputException, ParseException, 
     NonTransientResourceException { 
    // TODO Auto-generated method stub 
    return null; 
} 

}

在這樣定義的作業調用它:

<batch:job id="job1"> 
    <batch:step id="step1"> 
     <batch:tasklet> 
      <batch:chunk reader="pricereader" processor="priceprocessor" writer="pricewriter" commit-interval="1"/> 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 

這itemReader必須從外部文件解析數據。 我能想到的是這樣的:

private Scanner scanner; 
public MyItemReader(String filepath){ 
     //initializing scanner 
} 

無論如何,我發現,構造函數被調用春初始化,我不喜歡保持在內存中的開放連接到文件的想法。 此外,我想使用這個ItemReader從多個文件中讀取數據,所以在構造函數中添加這些信息並不是很好......任何想法?

回答

2

你所描述的正是ItemStream接口的用途。接口爲ItemStreamItemStream接口爲Spring Batch組件的狀態管理提供了便利。它包括一個open,updateclose方法,專門用於初始化狀態,保持所需的任何狀態以及清除任何狀態。在你的情況下,打開文件將在open方法中完成,並且close方法將處理關閉句柄。這些方法通過Spring Batch框架自動調用,並在FlatFileItemReader等閱讀器中用於同樣的事情。

事實上,由於結合使用ItemStream接口與TEH ItemReader界面是如此普遍,我們有一個聚合接口ItemStreamReader延伸兩者。您可以在這裏閱讀更多關於ItemStream界面的文檔:http://docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html#itemStream

+1

這是現貨!看着'FlatFileItemReader'的代碼,我能夠實現一個自定義的閱讀器,從'AbstractItemCountingItemStreamItemReader'進行插入操作,這將我自己的代碼的複雜性降低到最低限度。 – oschlueter