2016-08-03 88 views
1

我有一個彈簧批處理作業,它讀取,轉換並寫入Oracle數據庫。我通過CommandLineJobRunner實用程序(使用由maven shade插件生成的fat jar +依賴項)運行作業;由於「java堆內存限制已達到」,作業隨後中途失敗,並且作業未標記爲「失敗」,而是仍顯示「已啓動」狀態。無法重新啓動Spring批處理作業

我試圖用同樣的工作參數(如文檔建議)重新運行工作,但是這給了我這個錯誤:

5:24:34.147 [main] ERROR o.s.b.c.l.s.CommandLineJobRunner - Job Terminated in error: A job execution for this job is already running: JobInstance: id=1, version=0, Job=[maskTableJob] 

org.springframework.batch.core.repository.JobExecutionAlreadyRunningException:一JobInstance:id = 1,version = 0,Job = [maskTableJob] at org.springframework.batch.core.repository.support.SimpleJobRepository.createJobExecution(SimpleJobRepository.java:120)〜[我已經嘗試了各種各樣的東西(比如手動的s(s))。將狀態設置爲FAILED,使用-restart參數)但無濟於事。有沒有什麼我在這裏失蹤,因爲我認爲春季批次的一個優點是它能夠重新開始他們離開的工作.... !!?

+0

重新運行該作業將無法使用相同的參數。將當前時間添加爲重新運行的參數。請參閱http://www.mkyong.com/spring-batch/spring-batch-a-job-instance-already-exists-and-is-complete-for-parameters/。另外結帳的文檔:http://docs.spring.io/spring-batch/reference/html/configureJob.html#d5e1320 –

+0

是的,我知道,但我需要重新運行一個特定的工作,因爲我希望它繼續下去它離開的地方。我的工作處理TB行,可能需要幾天的時間才能運行,所以我確實希望每次都從頭開始重新開始該死的事情:-) –

+0

我認爲步驟中的塊處理應該處理這樣的事情 –

回答

2

您應該知道的第一件事是Joblauncher不能用於重新啓動已經運行的作業。 你得到「JobExecutionAlreadyRunningException」的原因是因爲你傳遞的參數已經存在於數據庫中,因此你得到這個異常。

在spring批處理中,如果作業完成時處於「FAILED」狀態或「STOPPED」狀態,則可以重新啓動作業。

JobOperator具有重啓方法,可以通過傳遞以「FAILED」狀態或「STOPPED」狀態完成的作業執行ID來重啓失敗的作業。

請注意,如果作業已完成且處於「完成」狀態,則無法重新開始作業。 在這種情況下,您將不得不使用新的作業參數提交新作業

如果要手動將作業狀態設置爲失敗,請運行以下查詢並使用JobOperator.restart()方法重新啓動作業。

update batch_job_execution set status="FAILED", version=version+1 where job_instance_id=jobId; 

對事務管理的不當處理可能是您的工作狀態沒有更新爲「FAILED」狀態的一個可能原因。即使作業遇到運行時異常,請確保您的事務正在完成。

+0

非常感謝那個回覆。我注意到,如果我的工作完成了status = FAILED和exitstatus = UNKNOWN,那麼我可以用相同的工作參數重新運行這個工作,但它似乎不會繼續停止,而是開始一個全新的工作。這是使用commandLineJobRunner,所以我會調查使用jobOperator從一個Java主,手動設置退出狀態,你說! –

+0

歡迎您,如果您認爲我的答案已解決您的問題,請點擊勾號將其接受爲正確答案:)。 – DevG

+0

我敲了一些Java重新啓動作業,通過jobOperator相同的作業參數,它似乎重新啓動好。我甚至在日誌中看到「恢復工作」,並認爲一切都很好,但是看起來我有一個新的執行ID,而且工作步驟從一開始就已經開始。我的目標數據庫顯示它包含比源證明更多的行,證明它沒有繼續。 –

相關問題