Spring Batch - 20. StepBuilderFactory 와 StepBuilder

출처

목차

StepBuilderFactory

StepBuilder 를 생성하는 팩토리 클래스

public class StepBuilderFactory {

private JobRepository jobRepository;

private PlatformTransactionManager transactionManager;

public StepBuilderFactory(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
this.jobRepository = jobRepository;
this.transactionManager = transactionManager;
}

public StepBuilder get(String name) {
StepBuilder builder = new StepBuilder(name).repository(jobRepository).transactionManager(
transactionManager);
return builder;
}
}

StepBuilder

Step 구성을 쉽게 하기 위한 빌더 클래스

StepBuilderFactory 객체내 get 메소드를 이용하면 StepBuilder 객체를 생성할 수 있다. StepBuilderFactory 객체를 통해 생성된 StepBuilder 객체는 호출되는 메소드에 따라 하위 Builder 객체 생성한 후 각 Step 생성을 위임한다

메소드별 생성되는 하위 StepBuilder 객체

메소드 반환 객체 설명
tasklet TaskletStepBuilder TaskletStep 를 생성하는 Builder 클래스
chunk SimpleStepBuilder TaskletStep 를 생성하며 내부적으로 Chunk 기반의 작업을 처리하는 ChunkOrientedTasklet 클래스를 생성한다.
partitioner PartitionStepBuilder PartitionStep 을 생성하며 Multi Thread 방식으로 Job 을 처리한다.
job JobStepBuilder JobStep 을 생성하여 Step 안에서 Job 을 실행한다.
flow FlowStepBuilder FlowStep 을 생성하여 Flow 안에서 Job 을 실행한다.

StepBuilder.java

public class StepBuilder extends StepBuilderHelper<StepBuilder> {

public StepBuilder(String name) {
super(name);
}

// TaskletStepBuilder 객체 생성
public TaskletStepBuilder tasklet(Tasklet tasklet) {
return new TaskletStepBuilder(this).tasklet(tasklet);
}

// SimpleStepBuilder 객체 생성
public <I, O> SimpleStepBuilder<I, O> chunk(int chunkSize) {
return new SimpleStepBuilder<I, O>(this).chunk(chunkSize);
}

// SimpleStepBuilder 객체 생성
public <I, O> SimpleStepBuilder<I, O> chunk(CompletionPolicy completionPolicy) {
return new SimpleStepBuilder<I, O>(this).chunk(completionPolicy);
}

// PartitionStepBuilder 객체 생성
public PartitionStepBuilder partitioner(String stepName, Partitioner partitioner) {
return new PartitionStepBuilder(this).partitioner(stepName, partitioner);
}

// PartitionStepBuilder 객체 생성
public PartitionStepBuilder partitioner(Step step) {
return new PartitionStepBuilder(this).step(step);
}

// JobStepBuilder 객체 생성
public JobStepBuilder job(Job job) {
return new JobStepBuilder(this).job(job);
}

// FlowStepBuilder 객체 생성
public FlowStepBuilder flow(Flow flow) {
return new FlowStepBuilder(this).flow(flow);
}
}

TaskletStepBuilder

@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet((contribution, chunkContext) -> {
System.out.println("step1 has executed");
return RepeatStatus.FINISHED;
})
.build();
}

SimpleStepBuilder

@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.<String, String>chunk(3)
.reader(() -> null)
.writer(list -> {})
.build();
}

PartitionStepBuilder

@Bean
public Step step3() {
return stepBuilderFactory.get("step3")
.partitioner(step1())
.gridSize(2)
.build();
}

JobStepBuilder

@Bean
public Step step4() {
return stepBuilderFactory.get("step4")
.job(job())
.build();
}
@Bean
public Job job() {
return this.jobBuilderFactory.get("job")
.start(step1())
.next(step2())
// .next(step3())
.build();
}

FlowStepBuilder

@Bean
public Step step5() {
return stepBuilderFactory.get("step5")
.flow(flow())
.build();
}
@Bean
public Flow flow() {
FlowBuilder<Flow> flowBuilder = new FlowBuilder<>("flow");
flowBuilder.start(step2()).end();
return flowBuilder.build();
}

Share