ドキュメントにも記載されているように、ステップの終了ステータスに基づいてフローを分岐することしかできません。カスタムの終了ステータス (バッチステータスから自動的にマップされたものとは異なる可能性があります) を報告できるようにするにafterStep
は、StepExecutionListener
.
最初のステップstep1
( Tasklet
classのインスタンス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();
}