Step Listener для добавления неудачных шагов в контекст выполнения - PullRequest
0 голосов
/ 16 апреля 2019

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

Хотя шаг в моей работе не удался, мы возвращаем 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 Ответ

1 голос
/ 17 апреля 2019

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

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

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

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

...