正如文档还提到的,我们只能根据步骤的退出状态对流程进行分支。为了能够报告自定义退出状态(可能不同于从批处理状态自动映射的退出状态),我们必须afterStep
为StepExecutionListener
.
假设我们有一个初始步骤step1
(一个Tasklet
类的实例Step1
),我们想要执行以下操作:
- 如果
step1
失败(例如通过抛出运行时异常),那么整个作业应该被视为FAILED
.
- 如果
step1
完成时退出状态为COMPLETED-WITH-A
,那么我们想要分支到某个step2a
应该处理这种特定情况的步骤。
- 否则,我们留在工作的主卡车上并继续 step
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();
}