#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
.