2013-08-05 44 views
0

我正在編寫一個批處理應用程序,我希望在應用程序邏輯識別問題並返回時立即設置退出狀態。如何在彈簧批量應用程序中設置退出狀態

例如我在我的寫作者的寫入方法中設置下面的狀態。

stepExecution.getJobExecution().setExitStatus(ExitStatus.FAILED); 

儘管執行了上述表述,但在日誌中獲取消息的下方,退出代碼似乎是成功的。 「

」批量執行成功!「

我可以知道如何正確設置退出代碼?

有一些方法可以在步驟之後設置。

像:

@AfterStep 
public ExitStatus afterStep(){ 
    //Test condition 
    return new ExistStatus("CUSTOM EXIT STATUS"); 
} 

但我不想堅持出口狀態,請執行,並設置在上述方法的退出狀態。

回答

1

你應該合理攔截job execution -

public void afterJob(JobExecution jobExecution){ 

    if(jobExecution.getStatus() == BatchStatus.COMPLETED){ 

     jobExecution.setExitStatus(new ExitStatus("CUSTOM SUCCESS STATUS")); 

    } else if(jobExecution.getStatus() == BatchStatus.FAILED){ 

     jobExecution.setExitStatus(new ExitStatus("CUSTOM FAILURE STATUS")); 

    } 

} 
+0

設置AfterJob方法中的ExitStatus和作者本身之間有什麼區別?我在這裏有點困惑。 – Kodaganti

+0

@Kodaganti您發佈的意思是使用監聽器並覆蓋afterStep調用。我的版本只是使用引用並設置其退出狀態,因爲您無法更改批處理狀態。 –

1

我也有類似的問題,只是解決了它5分鐘前。 我有多個步驟做'東西'和一個默認的「失敗步驟」,當所有其他步驟拋出異常時被調用。

拋出異常的步驟將被放棄在'spring-batch'邏輯中,但我需要它們失敗,以便我可以重新啓動它們。 因此,在嘗試使用偵聽器並強制執行狀態之後,我最終通過在調用「失敗步驟」之後更新廢棄步驟來完成工作。

所以,我的失敗步「看起來就像這樣:

public class EnleveDossiersRejetesEtMAJSteps implements Tasklet { 

    @Override 
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { 

    /**some business logic code for my step, AND the code bellow*/ 

    if (chunkContext.getStepContext() != null && chunkContext.getStepContext().getStepExecution() != null) { 
     Long jobExecutionId = chunkContext.getStepContext().getStepExecution().getJobExecutionId(); 

     batchTablesService.updateJobStepStatuses(jobExecutionId, BatchStatus.ABANDONED, BatchStatus.FAILED); 
    } 

    /** end the step like expected */ 
    return RepeatStatus.FINISHED; 
    } 
} 

我「batchTablesService」是我創建了一個服務類,它鏈接到簡單地檢索所有步驟的DAO,那麼對於所有的」被遺棄「的步驟,它將它們更新爲'失敗'。 像這樣:

@Override 
public void updateJobStepStatuses(Long jobExecutionId, BatchStatus sInitial, BatchStatus sFinal) { 
    log.debug("-- call updateJobStepStatuses(" + jobExecutionId + "," + sInitial + "," + sFinal + ")"); 

    List<BatchStepExecution> steps = getStepExecutions((int) (long) jobExecutionId, null); 
    for (BatchStepExecution step : steps) { 
     if (!step.getStatus().isEmpty() && step.getStatus().equalsIgnoreCase(sInitial.toString())) { 
      step.setStatus(sFinal.toString()); 
      entityManager.merge(step); 
     } 
    } 
} 

祝你好運!

相關問題