Повторять шаг тасклета до определенного состояния - PullRequest
0 голосов
/ 28 января 2019

Я использовал 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.Что меня смущает, так это то, что когда я комментирую эти две строки и код все еще работает.

Итак, мой вопрос, во-первых, если условный поток проверяет состояние выхода, почему мой код работаетбез явного изменения статуса выхода?Во-вторых, почему тасклет возвращает статус повторения и кем используется этот статус повторения.В-третьих, есть ли лучший способ достичь моей цели?

1 Ответ

0 голосов
/ 28 января 2019

если условный поток проверяет состояние выхода, почему мой код работает без явного изменения состояния выхода?

Поскольку по умолчанию, если тасклет возвращает RepeatStatus.FINISHED, его код выхода будетустановите значение COMPLETED

Во-вторых, почему тасклет возвращает статус повторения и кем используется этот статус повторения.

Тасклет повторно вызывается TaskletStepпока он не вернет RepeatStatus.FINISHED или не сгенерирует исключение, чтобы сообщить об ошибке.Каждый вызов Tasklet заключен в транзакцию.Следовательно, это структура цикла с границей транзакции внутри цикла.

В-третьих, есть ли лучший способ достичь моей цели?

ИМО, ваш Tasklet реализация в порядке, вам не нужен статус выхода.Что-то вроде:

@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws InterruptedException {
   //isReady method check the db to see if it is ready
   if (isReady()) {
    return RepeatStatus.FINISHED;
   } else {
    return RepeatStatus.CONTINUABLE;
   }
}

Это будет непрерывно выполняться до тех пор, пока isReady не станет истинным, поэтому вам не нужно реализовывать итерацию с потоком на уровне задания.Определение работы будет выглядеть следующим образом:

@Bean
public Job myJob(MyListener listener) {

   return jobBuilderFactory.get(jobName)
                        .incrementer(new RunIdIncrementer())
                        .listener(listener)
                        .start(checkStatusStep())
                        .next(mainStep())
                        .build();
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...