Как упоминается в документации, мы можем разветвить поток только на основе состояния выхода на шаг. Чтобы иметь возможность сообщать пользовательский статус выхода (возможно, отличный от того, который был автоматически отображен из состояния пакетной обработки), мы должны предоставить метод afterStep
для StepExecutionListener
.
Предположим, у нас есть первый шаг step1
(экземпляр Tasklet
класса Step1
), и мы хотим сделать следующее:
- если
step1
терпит неудачу (например, бросая исключение времени выполнения), то вся работу следует рассматривать как FAILED
.
- если
step1
завершает с выходом статус COMPLETED-WITH-A
, то мы хотим перейти на какой-то шаг step2a
, который якобы обрабатывает этот конкретный случай.
- в противном случае мы остановимся на главном грузовике работы и продолжим шаг
step2
.
Теперь обеспечивает afterStep
метод внутри Step1
класса (также реализующих StepExecutionListener
):
private static class Step1 implements Tasklet, StepExecutionListener
{
@Override
public ExitStatus afterStep(StepExecution stepExecution)
{
logger.info("*after-step1* step-execution={}", stepExecution.toString());
// Report a different exit-status on a random manner (just a demo!).
// Some of these exit statuses (COMPLETED-WITH-A) are Step1-specific
// and are used to base a conditional flow on them.
ExitStatus exitStatus = stepExecution.getExitStatus();
if (!"FAILED".equals(exitStatus.getExitCode())) {
double r = Math.random();
if (r < 0.50)
exitStatus = null; // i.e. COMPLETED
else
exitStatus = new ExitStatus(
"COMPLETED-WITH-A",
"Completed with some special condition A");
}
logger.info("*after-step1* reporting exit-status of {}", exitStatus);
return exitStatus;
}
// .... other methods of Step1
}
Наконец, построить поток рабочих мест внутри createJob
метода нашего JobFactory
реализации:
@Override
public Job createJob()
{
// Assume some factories returning instances of our Tasklets
Step step1 = step1();
Step step2a = step2a();
Step step2 = step2();
JobBuilder jobBuilder = jobBuilderFactory.get(JOB_NAME)
.incrementer(new RunIdIncrementer())
.listener(listener); // a job-level listener
// Build job flow
return jobBuilder
.start(step1)
.on("FAILED").fail()
.from(step1)
.on("COMPLETED-WITH-A").to(step2a)
.from(step1)
.next(step2)
.end()
.build();
}