我有一个类似的问题,并在 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);
}
}
}
祝你好运!