我正在编写一个批处理应用程序,我希望在应用程序逻辑识别出问题并返回时立即设置退出状态。
例如,我在写作者的写法中设置了以下状态。
stepExecution.getJobExecution().setExitStatus(ExitStatus.FAILED);
虽然上面的规则已经执行,但我在日志中得到的信息和退出代码似乎都是成功的。
“批量执行成功!”
我可以知道如何正确设置退出代码吗?
有一些方法可以在步骤之后设置。
像:
@AfterStep
public ExitStatus afterStep(){
//Test condition
return new ExistStatus("CUSTOM EXIT STATUS");
}
但我不想坚持退出站点并在上述方法中设置退出状态。
答案 0 :(得分:3)
你应该正确截取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"));
}
}
答案 1 :(得分:2)
我有类似的问题,并在5分钟前解决了。 我有多个步骤做'东西'和默认的"失败步骤"当所有其他步骤抛出异常时调用。
抛出异常的步骤将被放弃在“春天批次”中。逻辑,但我需要它们失败,以便我可以重新启动它们。 因此,在尝试使用听众和强制状态后,我终于通过在“失败”步骤之后更新已放弃的步骤来使其工作。被称为。
所以我的失败步骤'会是这样的:
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;
}
}
我的批量表服务'是我创建的一个服务类,它链接到一个简单检索所有步骤的DAO,然后是所有' Abandoned'步骤,它将它们更新为“失败”。 像这样:
@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);
}
}
}
祝你好运!
答案 2 :(得分:0)
不需要自定义接口或类。看看这个-