2013-08-29 51 views
3

我有如下一個簡單的工作:Spring Batch的 - 驗證標題行中輸入CSV文件,跳過該文件,如果它無效

<batch:step id="step"> 
<batch:tasklet> 
    <batch:chunk reader="itemReader" processor="itemProcessor" writer="itemWriter" commit- interval="5000" /> 
</batch:tasklet> 
</batch:step> 

itemReader是如下:

<bean id="itemReader" class="org.springframework.batch.item.file.FlatFileItemReader" 
scope="step"> 
<property name="linesToSkip" value="1"></property> 
<property name="skippedLinesCallback" ref="skippedLinesCallback" ></property> 

<property name="lineMapper"> 
    <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper"> 
       <property name="lineTokenizer" ref="lineTokenizer">     
       <property name="delimiter" value="," />      
      </bean> 
     </property> 
     <property name="fieldSetMapper"> 
      <bean 
       class="org.springframework.batch.item.file.mapping.PassThroughFieldSetMapper" /> 
     </property> 
    </bean> 
</property> 
<property name="resource" value="#{stepExecutionContext['inputKeyName']}" /> 
</bean> 

<bean id"lineTokenizer"      class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 

<bean id="skippedLinesCallback" class="com.test.IteMReaderHeader" > 
<property name="lineTokenizer" ref="lineTokenizer"> 
</bean> 

我設置在「com.test.IteMReaderHeader」類中輸入字段的「名稱」,方法是在其中注入「lineTokenizer」。

我需要驗證輸入csv文件中第一行的標題行是否帶有固定標題值,如果標題行無效,那麼在這種情況下,我需要失敗該步驟並跳過整個文件,以便下一個文件可以用於閱讀。

請建議實現它的合適的方式。 我真的很感激你的時間和寶貴意見。

謝謝!的FlatFileItemReader文件停止條件

回答

3

展望代碼管理;

  1. 與私人領域boolean noInput
  2. 私人function readLine()在保護doRead()

恕我直言最好的解決方法是從你的skippedLineCallback引發運行時異常和管理錯誤的讀者疲憊狀態下使用。

敵人例如寫這樣

class SkippableItemReader<T> implements ItemStreamReader<T> { 
    private ItemStreamReader<T> flatFileItemReader; 
    private boolean headerError = false; 

    void open(ExecutionContext executionContext) throws ItemStreamException { 
    try { 
     flatFileItemReader.open(executionContext); 
    } catch(MyCustomExceptionHeaderErrorException e) { 
     headerError = true; 
    } 
    } 

    public T read() { 
    if(headerError) 
     return null; 
    return flatFileItemReader.read(); 
    } 

    // Other functions delegation 
} 

您的委託(你必須手動註冊委託作爲流,當然)
或延長FlatFileItemReader作爲

class SkippableItemReader<T> extends FlatFileItemReader<T> { 
    private boolean headerError = false; 

    protected void doOpen() throws Exception { 
    try { 
     super.doOpen(); 
    } catch(MyCustomExceptionHeaderErrorException e) { 
     headerError = true; 
    } 
    } 

    protected T doRead() throws Exception { 
    if(headerError) 
     return null; 
    return super.doRead(); 
    }  
} 

的代碼已被寫入直接沒有測試,所以可能會出現錯誤,但我希望你能理解我的觀點。
希望能解決你的問題

+0

感謝您的投入。 第二種方法(擴展FlatFileItemReader)工作正常。 有一些問題,同時使用第一方法(即實現ItemStreamReader ) 此外,在上述情況下,纔有可能失敗的一步,但仍然跳過此文件? – grathi

+0

可能在步驟(或作業)執行上下文中保留headerError值,並在doOpen()/ doUpdate()/ doClose()或監聽器中對其進行管理。我從來沒有嘗試過,對不起。 –