我也有類似的問題,只是解決了它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);
}
}
}
祝你好運!
設置AfterJob方法中的ExitStatus和作者本身之間有什麼區別?我在這裏有點困惑。 – Kodaganti
@Kodaganti您發佈的意思是使用監聽器並覆蓋afterStep調用。我的版本只是使用引用並設置其退出狀態,因爲您無法更改批處理狀態。 –