[英]How to set exit status in spring batch application
我正在编写一个批处理应用程序,当我的应用程序逻辑识别出问题并返回时,我想在其中立即设置退出状态。
例如,我正在作者的write方法中设置以下状态。
stepExecution.getJobExecution().setExitStatus(ExitStatus.FAILED);
尽管执行了以上语句,但在日志中出现以下消息,并且退出代码似乎成功。
“批量执行成功!”
我可以知道如何正确设置退出代码吗?
设置步骤后有一些方法。
喜欢:
@AfterStep
public ExitStatus afterStep(){
//Test condition
return new ExistStatus("CUSTOM EXIT STATUS");
}
但是我不想坚持退出状态并在上述方法中设置退出状态。
您应该正确拦截作业执行 -
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"));
}
}
我有一个类似的问题,只是在5分钟前解决了。 我有多个执行“填充”的步骤和一个默认的“失败步骤”,当所有其他步骤都引发异常时会调用该默认步骤。
引发异常的步骤将在“ spring-batch”逻辑中被放弃,但是我需要将它们设置为Failed以便重新启动它们。 因此,在尝试了侦听器并设置了状态之后,我终于通过在调用“失败步骤”后更新放弃的步骤来使其正常工作。
因此,我的“失败步骤”将如下所示:
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”是我创建的一个Service类,它链接到一个DAO,该DAO仅检索所有步骤,然后对于所有“ Abandoned”步骤,将其更新为“ Failed”。 像这样:
@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);
}
}
}
祝好运!
不需要自定义接口或类。 看看这个 -
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.