Study/Spring Batch
스프링 배치 실행 -StepBuilderFactory
공29
2024. 4. 15. 23:56
1) StepBuilderFactory
- StepBuilder를 생성하는 팩토리 클래스로서 get(String name)메서드를 제공
- StepBuilderFactory.get("stepName")
- "stepName"으로 Step을 생성
2) StepBuilder
Step을 구성하는 설정 조건에 따라 다섯 개의 하위 빌더 클래스를 생성하고 실제 Step 생성을 위임한다.
- TaskletStepBuilder
- TaskletStep을 생성하는 기본 빌더 클래스
- SimpleStepBuilder
- TaskletStep을 생성하며 내부적으로 청크 기반의 작업을 처리하는 ChunkOrientedTasklet 클래스를 생성한다.
- PartitionStepBuilder
- PartitionStep을 생성하며 멀티 스레드 방식으로 Job을 실행한다.
- JobStepBuilder
- JobStep을 생성하여 Step안에서 Job을 실행한다.
- FlowStepBuilder
- FlowStep을 생성하여 Step안에서 Flow를 실행한다.
3) 흐름도
4) 클래스 상속 구조
5) 예제 코드
@RequiredArgsConstructor
@Configuration
public class StepBuilderConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job batchJob() {
return this.jobBuilderFactory.get("batchJob")
.incrementer(new RunIdIncrementer())
.start(step1())
.next(step2())
.next(step4())
.next(step5())
// .next(step3())
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet((contribution, chunkContext) -> { // 가장 기본이 되는 tasklet API
System.out.println("step1 has executed");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.<String, String>chunk(3) // chunk 기반의 작업을 처리할 수 있는 step
.reader(() -> null)
.writer(list -> {})
.build();
}
public Step step3() {
return stepBuilderFactory.get("step3")
.partitioner(step1())
.gridSize(2)
.build();
}
@Bean
public Step step4() {
return stepBuilderFactory.get("step4")
.job(job()) // step에서 job을 실행
.build();
}
@Bean
public Step step5() {
return stepBuilderFactory.get("step5")
.flow(flow()) // step에서 flow를 실행
.build();
}
@Bean
public Job job() {
return this.jobBuilderFactory.get("job")
.start(step1())
.next(step2())
// .next(step3())
.build();
}
@Bean
public Flow flow() {
FlowBuilder<Flow> flowBuilder = new FlowBuilder<>("flow");
flowBuilder.start(step2()).end();
return flowBuilder.build();
}
}