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();
    }
}