job과 step은 고정되고 정해진 패턴과 순서 그러한 흐름들을 구성될 때
job과 step으로 구성할 수 있지만
flow라는 개념은
정해진 순서나 패턴이 아닌
유연하고 상대적으로 복잡한 흐름들을 구성할 수 있다.
이번에는 job과 flow에 대한 개념들을 이해해보자.
Flow job
개념 및 api 소개
step을 순차적으로 구성하는 것이 아닌 특정한 상태에 따라 흐름을 전환하도록 구성할 수 있으며 flow job builder에 의해 생성된다.
step이 실패 하더라도 job은 실패로 끝나지 않도록 해야 하는 경우 (Simple job으로는 불가능)
step이 성공 했을 때 다음에 실행해야 할 step을 구분해서 실행 해야 하는 경우
특정 step은 전혀 실행되지 않게 구성 해야 하는 경우
Flow와 Job의 흐름을 구성하는데만 관여하고 실제 비즈니스 로직은 Step에서 이루어진다.
내부적으로 SimpleFlow 객체를 포함하고 있으며 Job 실행 시 호출한다.
Builder 구조와 api를 살펴보자.
flow 흐름을 정의하는 역할을 하는 api. (start, from, next )
Transition: 조건에 따라 흐름을 전환시키는 역할을 하는 api (on(), to() , stop() / fail() / end() / stopAndRestart())
회색으로 된 부분이 SimpleJob에 구성된 api
나머지가 flowJob에 구성된 api이다.
Flowjob에서는 FlowBuilder가 중요한 역할을 하는데 SimpleFlow를 생성하고 다양한 api가 있다.
on 메서드가 있으며 TranstionBuilder 가 생성이 되고
패턴에 따라서 그다음에 행동할 api를 5가지 중에 설정하고
1. to는 다른 step으로 이동하라
2. stop 중지로 끝낸다.
3. fail 실패로 끝낸다.
4. end 종료
5. stopAndRestart() 종료 후에 다시 재시작할 경우
그다음 flowBuilder가 return 되면서 다음 api를 사용할 수 있다.
package io.springbatch.springbatch.flowjob;
import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.Step;
import org.springframework.batch.core.StepContribution;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@RequiredArgsConstructor
@Configuration
public class FlowJobConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job flowJob() {
// step1이
// 성공 -> 3번 step으로 이동
// 실패 -> 2번 step으로 이동
return jobBuilderFactory.get("flowJOb")
.start(flowJobStep1())
.on("COMPLETED").to(flowJobStep3())
.from(flowJobStep1())
.on("FAILED").to(flowJobStep2())
.end().
build();
}
private Step flowJobStep1() {
return stepBuilderFactory.get("flowJobStep1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println();
return RepeatStatus.FINISHED;
}
}).build();
}
private Step flowJobStep2() {
return stepBuilderFactory.get("flowJobStep2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println();
return RepeatStatus.FINISHED;
}
}).build();
}
private Step flowJobStep3() {
return stepBuilderFactory.get("flowJobStep3")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
System.out.println();
return RepeatStatus.FINISHED;
}
}).build();
}
}
만약 step1이 실패한다고 해도 2번 step으로 이어지게 되고
2번 step이 성공하게 되면 결국 job은 성공하게 되었다고 나타나게 된다.
simple job 생성
on 메서드 실행
SimpleJobBuilder에서 JobFlowBuilder를 생성하고 on 메서드를 실행
JobFlowBuilder -> FlowBuilder on 메서드에서 TransitionBuilder를 만들어서 return하게 됨
마지막에는 SimpleFlow를 return하고
FlowJob이 SimpleFlow를 가지고 있고, SimpleFlow가 모든 흐름들을 제어한다.
start에는 flow와 step이 들어갈 수 있는데
우리는 이전에 next 메서드에 step을 넣어서 flowStep을 구성하였다.
step을 넣으면 simpleJobBuilder가 반환되는데
SimpleJobBuilder 에서도 on 메서드가 있기 때문에 on 메서드를 설정하게 되면
jobFlowBuilder가 반환되기 때문에 flowJob을 구성할 수 있다.
on이라는 메서드를 이용하면 실패하더라도 job이 성공될 수 있지만
아래와 같이 start와 next 메서드만을 이용한다면 하나의 step이 실패한다면 job도 실패로 표기된다.
'강의 > 스프링배치' 카테고리의 다른 글
스프링 배치 실행 - Transition (0) | 2023.01.27 |
---|---|
SpringBatch - Transition - 배치상태 유형 (BatchStatus / ExitStatus / FlowExecutionStatus) (0) | 2023.01.25 |
JobStep (0) | 2023.01.21 |
TaskletStep 아키텍처 (0) | 2023.01.21 |
TaskletStep 아키텍처 (0) | 2023.01.21 |