Прослушиватель шагов для добавления неудачных шагов в контекст выполнения

#spring #spring-batch #listener

#весна #весенний замес #слушатель

Вопрос:

Мне было интересно, есть ли способ использовать последующий шаг и создать прослушиватель выполнения шага, чтобы проверить наличие любых неудачных шагов в задании, и добавить это имя шага и статус выхода в контекст выполнения.

Хотя один шаг в моей работе провалился, мы возвращаемся RepeatStatus.FINISHED . Я создаю отчет по электронной почте и хочу включить имя и статус неудачного шага. Вот моя задача электронной почты

 public class SendEmailTasklet implements Tasklet {

    final static Logger LOGGER = LoggerFactory.getLogger(SendEmailTasklet.class);

    @Autowired
    public JavaMailSender emailSender;

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

        JobParameters jobParameters = chunkContext.getStepContext().getStepExecution().getJobParameters();
        ExecutionContext ec = chunkContext.getStepContext().getStepExecution().getJobExecution().getExecutionContext();

        //obtain email address and program name from the execution context
        String programName = ec.getString(AbstractSetupTasklet.BATCH_PROGRAM_NAME);
        String toEmail = jobParameters.getString("TOEMAIL");

        if(StringUtils.isEmpty(toEmail)) {

            LOGGER.info("No email address associated with the user. Job status is "   programStatus);

            return RepeatStatus.FINISHED;
        }
        else {

            //construct the message
            SimpleMailMessage message = new SimpleMailMessage();
            message.setTo(toEmail);
            message.setSubject("Batch Reporting");
            message.setText("The batch program "   programName   " has exited with a status of "   programStatus);
            emailSender.send(message);

            LOGGER.info("Email succesfully sent to user at "   toEmail);

            return RepeatStatus.FINISHED;
        }
    }


}
 

Как видно из приведенного выше кода, я хочу вернуть programStatus или что-то, что говорит: «задание выполнено с ошибкой на шаге X со статусом X»

Редактировать:

Для тех, кому интересно, я опубликую свой завершенный код ниже. Я создал новый метод создания сообщения электронной почты, чтобы также сократить количество повторяющегося кода

 public class SendEmailTasklet implements Tasklet {

    final static Logger LOGGER = LoggerFactory.getLogger(SendEmailTasklet.class);

    @Autowired
    public JavaMailSender emailSender;

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

        //Get the job info
        JobParameters jobParameters = chunkContext.getStepContext().getStepExecution().getJobParameters();
        ExecutionContext ec = chunkContext.getStepContext().getStepExecution().getJobExecution().getExecutionContext();

        //Get the step info
        JobExecution jobExecutions = chunkContext.getStepContext().getStepExecution().getJobExecution();
        Collection<StepExecution> stepExecution = jobExecutions.getStepExecutions();

        //Get the email address and program name
        String programName = ec.getString(AbstractSetupTasklet.BATCH_PROGRAM_NAME);
        String toEmail = jobParameters.getString("TOEMAIL");


        //If no email address exists, do not send the email.
        if(StringUtils.isEmpty(toEmail)) {

            LOGGER.info("No email address associated with the user.");
            return RepeatStatus.FINISHED;

        }
        else {

            //Check for the first failed step
            for (StepExecution step : stepExecution) {
                if(step.getExitStatus().equals(ExitStatus.FAILED)) {
                    String failedStep = step.getStepName();
                    sendBatchReportEmail(toEmail, programName, failedStep);
                    LOGGER.info(programName   " has failed on the step "   failedStep);
                    break;
                }
            }
            sendBatchReportEmail(toEmail, programName, null);
            LOGGER.info("No email address associated with the user.");
            return RepeatStatus.FINISHED;
        }

    }

    public void sendBatchReportEmail(String toEmail, String programName, String stepName) {
        if(Utils.isEmpty(stepName)) {
            //construct the message
            SimpleMailMessage message = new SimpleMailMessage();
            message.setTo(toEmail);
            message.setSubject("Batch Reporting");
            message.setText("The batch program "   programName   " has completed.");
            emailSender.send(message);
            LOGGER.info("Email succesfully sent to user at "   toEmail);            
        }
        else {
          //construct the message
            SimpleMailMessage message = new SimpleMailMessage();
            message.setTo(toEmail);
            message.setSubject("Batch Reporting");
            message.setText("The batch program "   programName   " has failed on step: "   stepName);
            emailSender.send(message);
            LOGGER.info("Email succesfully sent to user at "   toEmail   "and has failed on the step: "   stepName);
        }

    }

}
 

Ответ №1:

Вы можете получить доступ к выполнению задания из контекста блока с chunkContext.getStepContext().getStepExecution().getJobExecution() помощью .

После того, как у вас есть выполнение задания, вы можете получить все этапы выполнения jobExecution.getStepExecutions() и выполнить их итерацию, чтобы проверить последний неудачный шаг.

Последнее неудачное выполнение StepExecution дает вам имя шага, код выхода и описание, необходимые для создания вашего сообщения, а затем добавления его в контекст выполнения задания.

Надеюсь, это поможет.

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

1. Потрясающе, большое вам спасибо. Я посмотрю, что я могу с этим сделать

2. Я получил все пошаговые выполнения с помощью кода, подобного этому Collection<StepExecution> stepExecution = jobExecutions.getStepExecutions(); , что бы вы предложили в качестве наилучшего способа проверки на наличие неудачного последнего шага?

3. Вы можете взять первое , что у вас есть ExitStatus = FAILED .