春季批处理:在afterJob中获取exitStatusDescription

时间:2020-09-16 09:43:53

标签: java spring spring-batch

我是Spring Batch的新手。 我已经通过这项工作配置了一个新项目:

@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的类中获取错误说明?

@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() -> ""
    }

}

1 个答案:

答案 0 :(得分:1)

将步骤的退出状态设置为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
}
相关问题