Я использовал Spring batch для создания задания ETL.Моя основная работа - просто читать из БД и писать в другую.Перед моей основной работой мне нужно проверить состояние в исходной базе данных, чтобы увидеть, готово оно или нет.Я продолжу основную работу, только если исходная база данных готова.Я реализовал логику проверки состояния в виде тасклета, и я строю свою работу с простой логикой: если шаг проверки статуса не удался, повторите этот шаг, если этот этап выполнен успешно, затем перейдите к основному заданию.Я создаю задание следующим образом:
@Bean
public Job myJob(MyListener listener) {
return jobBuilderFactory.get(jobName)
.incrementer(new RunIdIncrementer())
.listener(listener)
.start(checkStatusStep())
.on("*").to(mainStep())
.on(ExitStatus.FAILED.getExitCode())
.to(checkStatusStep())
.end()
.build();
}
Шаг проверки состояния - это тасклет следующим образом:
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws InterruptedException {
//isReady method check the db to see if it is ready
if (isReady()) {
//contribution.setExitStatus(ExitStatus.COMPLETED);
return RepeatStatus.FINISHED;
} else {
//contribution.setExitStatus(ExitStatus.FAILED);
return RepeatStatus.CONTINUABLE;
}
}
Я читаю весенний пакетный документ и получаю, что метод ON в условном выраженииfollow проверит состояние выхода шага, чтобы я установил статус выхода в StepContribution.Что меня смущает, так это то, что когда я комментирую эти две строки и код все еще работает.
Итак, мой вопрос, во-первых, если условный поток проверяет состояние выхода, почему мой код работаетбез явного изменения статуса выхода?Во-вторых, почему тасклет возвращает статус повторения и кем используется этот статус повторения.В-третьих, есть ли лучший способ достичь моей цели?