2015-03-13 155 views
2

我想跳過一些處理記錄。彈簧批處理 - 在處理中跳過記錄

我試過的是,我創建了自定義異常並拋出異常,當我想跳過記錄,並調用跳過監聽器onSkipInProcess method.Its工作正常。

請找到配置。

<batch:chunk reader="masterFileItemReader" writer="masterFileWriter" processor="itemProcessor" commit-interval="5000" skip-limit="100000" > 
    <batch:skippable-exception-classes> 
     <batch:include class="org.springframework.batch.item.file.FlatFileParseException"/> 
     <batch:include class="com.exception.SkipException"/> 
    </batch:skippable-exception-classes> 
    <batch:listeners> 
     <batch:listener ref="recordSkipListener"/> 
</batch:listeners> 

但我想知道是否有任何其他的方式來跳過過程的記錄?

問候, 桑卡

+0

是的,我們可以跳過coditional基礎上進行記錄。請查看此代碼片段 – 2015-03-13 13:57:35

+0

您可以隨時閱讀文檔[此處](http://docs.spring.io/spring-batch/trunk/reference/html/configureStep.html)和[here](http:/ /docs.spring.io/spring-batch/trunk/reference/html/readersAndWriters.html)。你也可以在這裏找到很好的例子(http://www.programcreek.com/java-api-examples/index.php?api=org.springframework.batch.item.ItemProcessor)。 – falsarella 2015-06-15 17:32:10

回答

7

確實有兩種方法可以做到這一點,一個像你一樣跳躍機制和其他提與返回null這將過濾出項目,而不是寫它。這裏是documentation link - 6.3.2. Filtering records這裏很好地解釋了兩種方法之間的區別。此外,這blog post解釋批量跳過細節和交易。

當你ie分析csv文件,並且你期望每行有5個項目,但是一行保存了6個項目是無效的項目,你可以選擇跳過它(通過標記閱讀器異常作爲可跳過和定義你的策略條件舉例)。但是,如果每行包含名稱,並且您的用例不寫入以字母N開頭的項目,並且返回null(篩選項目)可以更好地實施,因爲它是有效的項目,但不符合您的業務案例。

請還請注意,如果您返回null數這些項目都將在StepContextgetFilterCount(),如果你使用跳過的方法,他們將在getReadSkipCount()getProcessorSkipCountgetWriteSkipCount尊敬。

+0

感謝@Nenad的詳細答案,以及何時使用null和何時使用跳過監聽器。 – Shankar 2015-03-15 06:07:18

+0

嗨Nenad,getFilterCount()方法在StepExecution類中,如何通過java獲取這個數據?我想在作業中獲取跳過的記錄數。 – Shankar 2015-03-16 13:08:14

+1

在我的測試中,我正在運行作業並保存該作業的執行,並且當我想驗證有多少人被過濾時,使用'jobExecution.getStepExecutions()'這是集合,但是我可以通過它運行並找到通過名稱執行的步驟方法'getFilterCount()' – 2015-03-16 14:03:10

1
@Component 
@Scope(value = "step") 
public class XyzItemProcessor implements ItemProcessor<ABCInfo , ABCInfo > { 

@Override 
public ABCInfo process(ABCInfo abcInfo) throws Exception { 

    if (abcInfo.getRecordType().equals("H") || extVoterInfo.getRecordType().equals("T")) 
     return null;////this is how we skip particular record to persist in database 
    else { 
     return abcInfo; 
    } 
} 
} 

返回null將跳過特定的記錄在數據庫中堅持

+0

謝謝@Bhaji ..我會檢查它並讓你知道.. – Shankar 2015-03-13 14:38:08

+1

如果你需要定期跳過 - 這是根據標準篩選出的記錄,你可以使用返回空值來跳過記錄被寫入。 onSkipInProcess用於處理期間發生異常並繼續處理但想要對錯誤記錄採取某些操作(日誌記錄,提醒電子郵件) – 2015-03-15 07:17:10

+0

返回'null'不會正好*跳過* ...返回'null'只會*過濾*。 *跳過*用於異常處理。閱讀[由Nenad鏈接的文檔](http://stackoverflow.com/a/29048138/1064325)。 – falsarella 2015-06-15 17:25:17

0

當我們在process()方法中返回null時,它會過濾記錄並增加過濾器計數。

@Transactional(propagation = Propagation.REQUIRED) 
    @Override 
    public SomeObject process(SomeObject someObject) throws Exception { 
     if (some condition) { 
      return null; 
     } 
} 

如果我們想跳過記錄,拋出異常。這將跳過記錄並增加processSkipCount。

@Transactional(propagation = Propagation.REQUIRED) 
    @Override 
    public SomeObject process(SomeObject someObject) throws Exception { 
     if (some condition) { 
      throw new Exception("invalid record"); 
     } 
} 

將此異常添加到上下文文件中。

<batch:skippable-exception-classes> 
<batch:include class="java.lang.Exception" /> 
</batch:skippable-exception-classes> 
0

還有一種不寫(跳過)東西的方法。例如,假設我們有這樣的步驟:

 <batch:step id="createCsvStep"> 
     <batch:tasklet> 
      <batch:chunk reader="jdbcCursorItemReader" processor="processor" writer="compositeWriter" 
         commit-interval="#{jobParameters['commit.interval']}" /> 
     </batch:tasklet> 
     </batch:step> 

     <bean id="compositeWriter" class="org.springframework.batch.item.support.CompositeItemWriter" scope="step"> 
     <property name="delegates"> 
      <list> 
      <ref bean="csvFileItemWriter1"/> 
      <ref bean="csvFileItemWriter2"/> 
      </list> 
     </property> 
     </bean> 

讓我們假設第一個作家會寫所有的值,但在同一時間,第二個作家會跳過其中的一些。爲了實現這一目標,我們可以擴大我們的作家(爲前FlatFileItemWriter),並覆蓋其寫入方法是這樣的:

@Override 
public void write(List<? extends T> items) throws Exception { 
    // ... 
    if (itemsPassesCheckingCondition) { 
     super.write(items); 
    } 
}