Spring 批次:在 afterJob 中获取 exitStatusDescription

Spring batch: get exitStatusDescription in afterJob

我是 Spring 批次的新手。 我用这个作业配置了一个新项目:

@Configuration
@EnableBatchProcessing
@Log4j2
public class BatchConfiguration {

    /* ... */

    @Bean
    public Job myJob(JobBuilderFactory jobBuilderFactory, Step stepInit, Step stepMain, Step stepReport) {
        return jobBuilderFactory.get("myJob").incrementer(new RunIdIncrementer()).start(stepInit).on(ExitStatus.FAILED.getExitCode()).fail().from(stepInit).on("*").to(stepMain).next(stepReport).end().listener(new BatchListener()).build();
    }

    @Bean
    public Step stepInit(StepBuilderFactory stepBuilderFactory) {
        return stepBuilderFactory.get("stepInit").tasklet(BatchInitialize.builder().build()).build();
    }

    /* ... */

}

在 BatchInitialize tasklet 中,我定义了一个带有 errorDesc 的退出状态:

@Builder
@AllArgsConstructor
@Log4j2
public class BatchInitialize implements Tasklet {

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

        if(CONDITION) {
            contribution.setExitStatus(new ExitStatus(ExitStatus.FAILED.getExitCode(), "ERROR DESC"));
            return RepeatStatus.FINISHED;
        }

        /* ... */
    }

}

如何在实现 JobExecutionListener 的 class 中获取错误描述?

@Builder
@AllArgsConstructor
@Log4j2
public class BatchListener implements JobExecutionListener {

    @Override
    public void beforeJob(JobExecution jobExecution) {
        //
    }

    @Override
    public void afterJob(JobExecution jobExecution) {
        // jobExecution.getExitStatus().getExitCode() -> FAILED
        // jobExecution.getExitStatus().getExitDescription() -> ""
    }

}

将步骤的退出状态设置为 FAILED 并返回 RepeatStatus.FINISHED 对我来说没有意义。如果 tasklet 失败,我会设置它的退出状态并抛出异常(另一种选择是使用异常消息并将其设置为 ERROR DESC)。

现在如果你想在监听器中获取异常,你可以这样做:

@Override
public void afterJob(JobExecution jobExecution) {
    List<Throwable> allExceptions = jobExecution.getAllFailureExceptions();
    // get the exception and its message
}

如果你想获取特定步骤的存在状态,你可以这样做:

@Override
public void afterJob(JobExecution jobExecution) {
    List<StepExecution> stepExecutions = jobExecution.getStepExectuions();
    // iterate and get the step execution  you want then get its exit status
}