#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 и задать описание. Какое из них является лучшим решением?