У меня есть весеннее пакетное задание, давайте скажем 5 шагов (step1 --> step2 --> step3 --> step4 --> step5
). Я настроил StepExectutionListener
, который прослушивает 2 события
beforeStep()
и afterStep()
для всех этапов.
Мой вопрос заключается в том, что если я нахожусь в beforeStep()
, и шаг, который нужно выполнить, это step2
, могу ли я снова запустить step1
в beforeStep()
-пакет? После выполнения step1
1 поток должен продолжаться до step2
, step3
и т.д.
Чтобы еще раз пояснить, могу ли я сказать весенней партии "начать выполнение" с ранее выполненного шага еще раз?
Хотя я, вероятно, не рекомендую это поведение, да, оно должно быть выполнено. Вам нужно будет настроить step2 для перехода к шагу 1 с правильным кодом выхода, и шаг 1 должен будет повторить.
конфигурация
<step id="step1" next="step2">
<tasklet ref="someTasklet" allow-start-if-complete="true"/>
</step>
<step id="step2">
<tasklet ref="someOtherTasklet"/>
<listeners>
<listener ref="loopingListener"/>
</listeners>
<next on="BACK" to="step1"/>
</step>
Код
public class LoopingListener extends StepExecutionListenerSupport {
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
if(shouldLoop) {
return new ExitStatus("BACK");
} else {
return stepExecution.getExitStatus();
}
}
}
Вы можете добиться определенного порядка шагов, используя следующий подход.
<step id="step1" next="step3">
<tasklet>(...)</tasklet>
</step>
следующий параметр определит, что будет выполнено следующим образом. Однако я не уверен, что вы можете вернуться в одно и то же исполнение. Но Spring позволяет перезапустить шаг, если вы используете
позволяет стартер-если-полный
к истине.
Также для создания рабочих процессов см. Http://docs.spring.io/spring-batch/2.2.x/apidocs/org/springframework/batch/core/job/builder/FlowBuilder.SplitBuilder.html.
Надеюсь это поможет.