Весенняя партия: получите описание ExitStatus в afterJob

#java #spring #spring-batch

#java #весна #весенний пакет

Вопрос:

Я новичок в 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 я определил статус выхода с ошибкой:

 @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:

Установка статуса завершения шага на FAILED и возврат RepeatStatus.FINISHED для меня не имеет смысла. Если тасклет не удался, я бы установил его статус выхода и вместо этого выдал исключение (другой вариант — использовать сообщение об исключении и установить для него значение ERROR DESC ).

Теперь, если вы хотите получить исключение в прослушивателе, вы можете сделать что-то вроде:

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

Если вы хотите получить статус exist определенного шага, вы можете сделать что-то вроде:

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

Комментарии:

1. Вы правы, но если я создам новое исключение, мне все равно придется установить значение «chunkContext.getStepContext().getStepExecution().getJobExecution().setExitStatus», чтобы восстановить описание ошибки в методе afterJob, верно?

2. о, подождите, мне кажется, я неправильно понял ваш первоначальный вопрос.. Вы установили статус завершения шага на ERROR DESC , но вы пытаетесь получить его из выполнения задания здесь // jobExecution.getExitStatus().getExitDescription() -> "" . Вы уверены, что хотите получить его из выполнения задания, а не из выполнения шага? например: jobExecution.getStepExecutions() , затем вы повторяете выполнение шага, чтобы найти тот, для stepInit и сделать stepExecution.getExitStatus.getExitDescription() ? Это должно сработать. Если это то, что вы ищете, я обновлю ответ.

3. Извините, я описываю вам свою проблему: если во время выполнения пакета (на любом шаге) возникают определенные условия, мне нужно остановить выполнение, установить статус FAILED и задать описание. Какое из них является лучшим решением?