Мне было интересно, есть ли способ использовать 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);
}
}
}