
아래의 코드는 하나의 Job에서 여러 Step을 실행하는 예제이다.
@Configuration
@RequiredArgsConstructor
public class MultipleStepJobConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job multipleStepJob(Step multipleStep1, Step multipleStep2, Step multipleStep3) {
return jobBuilderFactory.get("multipleStepJob")
.incrementer(new RunIdIncrementer())
.start(multipleStep1)
.next(multipleStep2)
.next(multipleStep3)
.build();
}
@JobScope
@Bean
public Step multipleStep1() {
return stepBuilderFactory.get("multipleStep1")
.tasklet((contribution, chunkContext) -> {
System.out.println("step1");
return RepeatStatus.FINISHED;
})
.build();
}
@JobScope
@Bean
public Step multipleStep2() {
return stepBuilderFactory.get("multipleStep2")
.tasklet((contribution, chunkContext) -> {
System.out.println("step2");
ExecutionContext executionContext = chunkContext
.getStepContext()
.getStepExecution()
.getJobExecution()
.getExecutionContext();
executionContext.put("someKey", "hello!!");
return RepeatStatus.FINISHED;
})
.build();
}
@JobScope
@Bean
public Step multipleStep3() {
return stepBuilderFactory.get("multipleStep3")
.tasklet((contribution, chunkContext) -> {
System.out.println("step3");
ExecutionContext executionContext = chunkContext
.getStepContext()
.getStepExecution()
.getJobExecution()
.getExecutionContext();
System.out.println(executionContext.get("someKey"));
return RepeatStatus.FINISHED;
})
.build();
}
}
하나의 Job에서 여러 스텝을 실행시키고 싶다면 아래와 같이 수행할 수 있다.
.start(multipleStep1)
.next(multipleStep2)
.next(multipleStep3)
그리고 특정 스텝에서 다른 스텝으로 데이터를 전달하고 싶다면 아래와 같이 사용할 수 있다.
ExecutionContext executionContext = chunkContext
.getStepContext()
.getStepExecution()
.getJobExecution()
.getExecutionContext();
executionContext.put("someKey", "hello!!");
...
...
...
System.out.println(executionContext.get("someKey"));
@Configuration
@RequiredArgsConstructor
public class ConditionalStepJobConfig {
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job conditionalStepJob(
Step conditionalStartStep,
Step conditionalAllStep,
Step conditionalFailStep,
Step conditionalCompletedStep) {
return jobBuilderFactory.get("conditionalStepJob")
.incrementer(new RunIdIncrementer())
.start(conditionalStartStep)
.on("FAILED").to(conditionalFailStep)
.from(conditionalStartStep)
.on("COMPLETED").to(conditionalCompletedStep)
.from(conditionalStartStep)
.on("*").to(conditionalAllStep)
.end()
.build();
}
@JobScope
@Bean
public Step conditionalStartStep() {
return stepBuilderFactory.get("conditionalStartStep")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
// System.out.println("conditional Start Step");
// return RepeatStatus.FINISHED;
throw new Exception("Exception!!");
}
})
.build();
}
@JobScope
@Bean
public Step conditionalAllStep() {
return stepBuilderFactory.get("conditionalAllStep")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("conditional All Step");
return RepeatStatus.FINISHED;
}
})
.build();
}
@JobScope
@Bean
public Step conditionalFailStep() {
return stepBuilderFactory.get("conditionalFailStep")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("conditional Fail Step");
return RepeatStatus.FINISHED;
}
})
.build();
}
@JobScope
@Bean
public Step conditionalCompletedStep() {
return stepBuilderFactory.get("conditionalCompletedStep")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("conditional Completed Step");
return RepeatStatus.FINISHED;
}
})
.build();
}
}
아래와 같이 Job은 분기 처리가 가능하다.
.incrementer(new RunIdIncrementer())
.start(conditionalStartStep)
.on("FAILED").to(conditionalFailStep)
.from(conditionalStartStep)
.on("COMPLETED").to(conditionalCompletedStep)
.from(conditionalStartStep)
.on("*").to(conditionalAllStep)
.end()