2013-10-24 47 views
0

要求:
管理器不希望作業實例和作業執行表中有多個作業實例。儘管多次執行都很好,他只想要一個實例。如何使我的Spring批處理步驟執行以非COMPLETED狀態結束

含義: 作業無法以批處理狀態COMPLETED結束,因爲此類實例永遠無法重新啓動。

我的方法: 我嘗試以批處理狀態STOPPED結束作業,以便作業的下一次運行運行先前運行的同一個實例。 (請注意,如果作業失敗,那麼因爲失敗的實例可以重新運行,所以沒有問題)。我打算沒有該作業的參數,以便在每次運行時創建的默認實例與數據庫中已存在的實例(作業實例表)匹配。這樣,我不必擔心在重新啓動時將任何參數傳遞給作業,因爲只有一個實例並且它沒有區分參數。

問題: 如果所有步驟都完成並且BATCH_STEP_EXECUTION對於所有這些步驟都更新爲COMPLTED,即使我設法使作業執行以STOPPED狀態結束,我也不能再重新運行同一作業實例。我收到以下消息:所有步驟已完成或未配置此作業的步驟。

我知道消息的意思,但我試圖讓所有步驟都以完成狀態結束,以便每當我重新運行我的單個實例時,這些步驟都可以重新運行,而不是獲取上面的消息。 我知道,可以使用步驟執行狀態來派生作業執行狀態。例如,如果某個步驟以STOPPED結尾,則可以使用該狀態指示作業以「已停止」以及「元素」結尾。這不是我正在尋找的,因爲我已經知道如何使用它們,除非有辦法執行它們,以便它們影響BATCH_STEP_EXECUTION表中更新的內容。

在該表中,如果成功而不是COMPLETED,我希望這些步驟以STOPPED結束。有任何想法嗎?首先可以做到這一點嗎?

回答

4

來設置步驟執行狀態 -

StepExecution stepExecution = StepSynchronizationManager.getContext().getStepExecution(); 
stepExecution.setExitStatus("XYZ") 

的一例 '末端上' 在步驟

<batch:step id="step1"> 
    <batch:tasklet ref="aaaTasklet"/> 
    <batch:end on="END1" /> 
    <batch:end on="XYZ"/> 
    <batch:next on="*" to="step2" /> 
    <batch:listeners> 
     <batch:listener ref="aaaTaskletListener" /> 
    </batch:listeners> 
</batch:step> 

<batch:step id="step2"> 
. 
. 
. 
</batch:step> 

批處理模式 - http://www.springframework.org/schema/batch/spring-batch-2.2.xsd 搜索

+1

非常感謝,這似乎是有道理的。我會嘗試這種方法,並將結果提供給其他可能感興趣的人。 – mgibson

+1

很棒的工作。乾淨的工作回答 –

1

必須完成作業(作爲步驟)才能讓spring-batch正確管理作業的生命週期。

允許多次運行同一作業的方法是使用額外的作業參數使每個作業與其他作業不同,您可以使用JobParametersIncrementer或只需添加一個新參數,如startDate = new Date()
IMO應該避免你的方式。

+0

謝謝Bellabax。看來我沒有選擇,只能有多個工作實例。您是否知道有什麼方法定期清理基礎架構表?我們的批次將每天運行8次,因此隨着時間的推移,這些表格可能會變得非常大。 – mgibson

+1

預定有石英的工作:) –

0

獲取「所有步驟已完成或未配置此作業的步驟」。這可能是因爲你使用完全相同的參數運行相同的工作。

爲了解決這個問題很容易,你可以只添加一個時間戳這樣的JobParams:

@Test 
public void importFilesTest() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException { 
    jobLauncher.run(job, new JobParametersBuilder() 
      .addLong("timestamp", 
        System.currentTimeMillis()) 
      .toJobParameters()); 
} 
0

我有同樣的問題。我想在失敗時重新開始工作。我使用決策器在批處理作業配置文件中進行流量決策。

當我故意失敗/停止作業,並重新運行更正的數據時,作業直接跳轉到判定器而無需重新運行我希望在失敗時重新運行的步驟。我對它進行了研究,並得出結論:您不能以相同的作業參數重新運行該步驟,即使作業失敗/停止。由於在批處理作業表中,步驟的狀態爲「已完成」。因此按照春季批次生命週期,Job將從其失敗的時刻開始。就我而言,這一點是決定性的。因此,工作從決策者運行到正確管理批處理作業生命週期。 希望這對你有所幫助。

相關問題