2014-12-30 118 views
0

我試着彈出批處理。通過ItemReader和ItemWriter運行作業時,我見過很多示例。如果一項工作沒有錯誤地運行,沒有問題。 但是我還沒有找到如何處理一個作業失敗後,處理大量的記錄狀態。彈出批處理狀態,當步驟失敗

我的場景很簡單。從xml文件(ItemReader)讀取記錄並調用外部系統進行存儲(ItemWriter)。那麼如果外部系統在進程中間不可用並且一段時間後作業狀態設置爲FAILED,會發生什麼情況?如果我在外部系統啓動並運行的第二天再次手動重新啓動作業,那麼我將得到以前加載的記錄的重複項。

在某些方面,我必須有用於跳過已經加載的記錄的信息。 我試圖通過ExecutionContext存儲遊標,但是當我重新啓動作業時,我得到一個新的JOB_EXECUTION_ID,並且遊標數據丟失,因爲BATCH_STEP_EXECUTION_CONTEXT.SHORT_CONTEXT中有一個新行。重新啓動時,BATCH_STEP_EXECUTION.COMMIT_COUNT和BATCH_STEP_EXECUTION.READ_COUNT也會重置。

我使用JobOperator重新啓動作業: jobOperator.restart(jobExecutionId);

有沒有辦法重新啓動一項工作,而無需獲得新的jobExecutionId或交替的方式來獲取失敗的工作狀態。如果有人發現(可以提供)示例包含狀態和錯誤處理,我會很高興。

一個替代解決方案當然是創建我自己的表來保存已處理記錄的軌跡,但我真的希望框架有一個機制。否則,我不會用春天的批次來說明這個想法。

問候 墊

回答

2

一個主要特點Spring Batch的提供是在作業庫作業的狀態的持久性。當作業失敗時,重新啓動時,默認行爲是在失敗步驟重新啓動作業(跳過已成功完成的步驟)。在基於塊的步驟中,我們的大多數讀者(包括StaxEventItemReader)存儲在作業存儲庫中已處理的記錄(具體在ExecutionContext內)。默認情況下,當基於塊的步驟失敗時,將在上一次失敗的塊上重新啓動,跳過成功處理的塊。

這一切的一個例子是,如果你有一個三步工作:

<job id="job1"> 
    <step id="step1" next="step2"> 
     <tasklet> 
      <chunk reader="reader1" writer="writer1" commit-interval="10"/> 
     </tasklet> 
    </step> 
    <step id="step2" next="step3"> 
     <tasklet> 
      <chunk reader="reader2" writer="writer2" commit-interval="10"/> 
     </tasklet> 
    </step> 
    <step id="step3"> 
     <tasklet> 
      <chunk reader="reader3" writer="writer3" commit-interval="10"/> 
     </tasklet> 
    </step> 
</job> 

而且我們說這個作業完成第一步,那麼第二步有1000條記錄進行處理,但在創紀錄的507塊失敗由記錄500-510組成的記錄將回滾,該作業將被標記爲失敗。該作業的重新啓動將跳過step1,在步驟2中跳過記錄1-499並從步驟2的記錄500開始(假設您正在使用有狀態項讀取器)。

對於重新啓動時的jobExecutionId,Spring Batch具有作業實例(邏輯運行)和作業執行(物理運行)的概念。對於每天運行的工作,邏輯運行將是星期一運行,星期二運行等。其中每個工作將包括它們自己的JobInstance。如果工作成功,JobInstance將最終只有一個JobExecution與它關聯。如果失敗並重新運行,則會爲每次重新啓動作業創建一個新的JobExecution

您可以在Spring Batch的文檔中讀取一般和具體方案的更多有關錯誤處理在這裏找到:http://docs.spring.io/spring-batch/trunk/reference/html/index.html

+0

謝謝支持!我的問題更多地是關於在一個塊內保持狀態。我的工作只有一個步驟,如下所示: 閱讀器讀取xml並且編寫器更新外部資源。塊內是否仍然支持spring-batch狀態(如果我重新啓動作業,如果在前一天處理過程中作業失敗,則跳過一些xml記錄)?也許替代方案是有兩個步驟沒有任何塊呢? – Mats

+0

然而,我使用'JobExecution'作爲例子,'StepExecution'(和它的相關的'ExecutionContext')在一個步驟中保持狀態,包括由塊組成的塊。在每個塊提交之後,步驟的狀態(包括已讀取的記錄數等)將保存到作業存儲庫中,以便發生故障時,已重新處理的記錄將被跳過。 –

相關問題