我試着彈出批處理。通過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或交替的方式來獲取失敗的工作狀態。如果有人發現(可以提供)示例包含狀態和錯誤處理,我會很高興。
一個替代解決方案當然是創建我自己的表來保存已處理記錄的軌跡,但我真的希望框架有一個機制。否則,我不會用春天的批次來說明這個想法。
問候 墊
謝謝支持!我的問題更多地是關於在一個塊內保持狀態。我的工作只有一個步驟,如下所示: 閱讀器讀取xml並且編寫器更新外部資源。塊內是否仍然支持spring-batch狀態(如果我重新啓動作業,如果在前一天處理過程中作業失敗,則跳過一些xml記錄)?也許替代方案是有兩個步驟沒有任何塊呢? –
Mats
然而,我使用'JobExecution'作爲例子,'StepExecution'(和它的相關的'ExecutionContext')在一個步驟中保持狀態,包括由塊組成的塊。在每個塊提交之後,步驟的狀態(包括已讀取的記錄數等)將保存到作業存儲庫中,以便發生故障時,已重新處理的記錄將被跳過。 –