이번 글에서는 Step을 여러 개 생성해 사용하고 또 Step 사이에 분기처리를 통해 동적으로 실행하는 방법에 대해 알아보겠습니다.
먼저, 여러 Step을 사용하는 것은 매우 쉽습니다. 3개의 Step을 준비해놓고, 순서대로 실행시키기만 하면 됩니다.
@Configuration
@RequiredArgsConstructor
public class MultiStepJobConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
// 잡
@Bean
public Job multiStepJob(Step multiStepStep1,
Step multiStepStep2,
Step multiStepStep3 ) {
return jobBuilderFactory.get("multiStepJob") // 이 Job의 이름을 지정
.incrementer(new RunIdIncrementer()) // Job의 식별자인 id값 자동 증가
.start(multiStepStep1) // 실행될 Step을 지정
.next(multiStepStep2)
.next(multiStepStep3)
.build();
}
// 스텝 1
@Bean
@JobScope
public Step multiStepStep1() {
return stepBuilderFactory.get("multiStepStep1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext chunkContext) throws Exception {
System.out.println("First Step Start");
return RepeatStatus.FINISHED;
}
})
.build();
}
// 스텝 2
@Bean
@JobScope
public Step multiStepStep2() {
return stepBuilderFactory.get("multiStepStep2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext chunkContext) throws Exception {
System.out.println("Second Step Start");
return RepeatStatus.FINISHED;
}
})
.build();
}
// 스텝 3
@Bean
@JobScope
public Step multiStepStep3() {
return stepBuilderFactory.get("multiStepStep3")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext chunkContext) throws Exception {
System.out.println("Third Step Start");
return RepeatStatus.FINISHED;
}
})
.build();
}
}
그리고 Step 간의 분기처리를 하려면 Job에서 start(), on(), to(), from()의 코드를 사용해아래와 같이 설정하면 됩니다.
@Configuration
@RequiredArgsConstructor
public class ConditionalStepJobConfig {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
// 잡
@Bean
public Job conditionalStepJob(Step conditionalStepStep,
Step conditionalAllStepStep,
Step conditionalCompliteStepStep,
Step conditionalFailStepStep) {
return jobBuilderFactory.get("conditionalStepJob") // 이 Job의 이름을 지정
.incrementer(new RunIdIncrementer()) // Job의 식별자인 id값 자동 증가
.start(conditionalStepStep)
.on("FAILED").to(conditionalFailStepStep)
.from(conditionalStepStep)
.on("COMLETED").to(conditionalCompliteStepStep)
.from(conditionalStepStep)
.on("*").to(conditionalAllStepStep)
.end()
.build();
}
// 스텝 1
@Bean
@JobScope
public Step conditionalStepStep() {
return stepBuilderFactory.get("conditionalStepStep")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext chunkContext) throws Exception {
System.out.println("First Step Start");
return RepeatStatus.FINISHED;
}
})
.build();
}
// 스텝 전체
@Bean
@JobScope
public Step conditionalAllStepStep() {
return stepBuilderFactory.get("conditionalAllStepStep")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext chunkContext) throws Exception {
System.out.println("conditionalAllStepStep Start");
return RepeatStatus.FINISHED;
}
})
.build();
}
// 스텝 성공
@Bean
@JobScope
public Step conditionalCompliteStepStep() {
return stepBuilderFactory.get("conditionalCompliteStepStep")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext chunkContext) throws Exception {
System.out.println("conditionalCompliteStepStep Start");
return RepeatStatus.FINISHED;
}
})
.build();
}
// 스텝 실패
@Bean
@JobScope
public Step conditionalFailStepStep() {
return stepBuilderFactory.get("conditionalFailStepStep")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution,
ChunkContext chunkContext) throws Exception {
System.out.println("conditionalFailStepStep Start");
return RepeatStatus.FINISHED;
}
})
.build();
}
}
다음 글에서는 이제껏 만든 배치 프로그램을 실행시키는 방법에 대해 알아보겠습니다.