Spring Batch - 24. FlowJob

출처

목차

FlowJob

FlowJob은 일련의 스텝으로 구성됩니다. 각 스텝은 Tasklet 또는 Chunk 지향 스텝으로 구성될 수 있습니다. Tasklet은 일련의 작업을 수행하는 데 사용되며, Chunk 지향 스텝은 대량의 데이터를 처리할 때 사용됩니다.

FlowJob은 각 스텝이 성공적으로 완료되면 다음 스텝으로 이동하도록 작동합니다. 각 스텝은 성공, 실패 또는 종료와 같은 결과를 반환합니다. 이 결과를 기반으로 FlowJob은 다음 스텝으로 이동하거나 작업을 중지할 수 있습니다.

FlowJob은 각 스텝의 결과에 따라 다른 스텝으로 이동하거나 작업을 중지하도록 구성할 수 있습니다. 이를 통해 Spring Batch 사용자는 FlowJob을 사용하여 유연하고 복잡한 Batch 작업을 쉽게 구현할 수 있습니다.

또한, FlowJob은 분기와 조건 분기를 지원하여 작업 흐름을 더욱 세밀하게 제어할 수 있습니다. 예를 들어, 분기를 사용하여 성공 또는 실패에 따라 다른 작업을 실행하거나, 조건 분기를 사용하여 입력 데이터의 특성에 따라 다른 작업을 실행할 수 있습니다.

FlowJobBuilder

public class FlowJobBuilder extends JobBuilderHelper<FlowJobBuilder> {

private Flow flow;

public FlowJobBuilder(JobBuilderHelper<?> parent) {
super(parent);
}

public JobFlowBuilder start(Flow flow) {
return new JobFlowBuilder(this, flow);
}

public JobFlowBuilder start(Step step) {
return new JobFlowBuilder(this, step);
}

protected FlowJobBuilder flow(Flow flow) {
this.flow = flow;
return this;
}

public Job build() {
FlowJob job = new FlowJob();
job.setName(getName());
job.setFlow(flow);
super.enhance(job);
try {
job.afterPropertiesSet();
}
catch (Exception e) {
throw new StepBuilderException(e);
}
return job;
}
}
public class JobFlowBuilder extends FlowBuilder<FlowJobBuilder> {

private FlowJobBuilder parent;

public JobFlowBuilder(FlowJobBuilder parent) {
super(parent.getName());
this.parent = parent;
}

public JobFlowBuilder(FlowJobBuilder parent, Step step) {
super(parent.getName());
this.parent = parent;
start(step);
}

public JobFlowBuilder(FlowJobBuilder parent, JobExecutionDecider decider) {
super(parent.getName());
this.parent = parent;
start(decider);
}

public JobFlowBuilder(FlowJobBuilder parent, Flow flow) {
super(parent.getName());
this.parent = parent;
start(flow);
}

@Override
public FlowJobBuilder build() {
Flow flow = flow();

if(flow instanceof InitializingBean) {
try {
((InitializingBean) flow).afterPropertiesSet();
}
catch (Exception e) {
throw new FlowBuilderException(e);
}
}

parent.flow(flow);
return parent;
}

}

FlowBuilder

@Bean
public Job batchJob() {
return jobBuilderFactory.get("batchJob")
.start(step1())
// step1 이 COMPELETED 상태일 경우 step2 를 실행한다.
.on("COMPLETED").to(step2())
.from(step1())
// step1 이 FAILED 상태일 경우 step2 를 실행한다.
.on("FAILED").to(step3())
.end()
.build();
}
Share