Flow
- Step이 특정한 상태에 따라 흐름을 전환하도록 구성할 수 있는 Job, FlowJobBuilder에 의해 생성됨
- 내부적으로 SimpleFlow 객체를 포함하고 있으며, Job 실행시 호출함.
public Job batchJob() {
return jobBuilderFactory.get("batchJob")
.start(Flow)
.next(Step or Flow or JobExcecuitonDecider)
.on(String pattern)
.to(Step)
.stop() / fail() / end() / stopAndRestart()
.end()
.build();
}
- start(Flow) => 이처럼 Flow로 설정하게 되면 JobFlowBuilder가 반환된다.
Transition
배치 상태 유형
BatchStatus
- JobExcecution과 StepExcecution의 속성
- Job과 Step의 종료 후 최종 결과 상태가 무엇인지 정의
SimpleJob
- 마지막 Step의 BatchStatus 값을 Job의 최종 BatchStatus값으로 반영
- Step이 실패할 경우 해당 Step이 마지막 Step이 됨
FlowJob
- Flow내 Step의 ExitStatis값을 FlowExcecutionStatus값으로 저장
- 마지막 Flow의FlowExcecuitoStatus값을 Job의 최종 BatchStatus값으로 반영함
BatchStatus는 Enum으로 관리되고 있음.
- COMPLETED, STARTING, STARTED, STOPPING, STOPPED, FAILED, ABANDONED, UNKOWN
ExitStatus
- JobExecution 과 StepExecution의 속성으로 Job 과 Step 의 실행 후 어떤 상태로 종료되었는지 정의
- 기본적으로 ExitStatus 는 BatchStatus 와 동일한 값으로 설정된다
- 비즈니스 논리 측면의 차이가 있음.
SimpleJob
- 마지막 Step 의 ExitStatus 값을 Job 의 최종 ExitStatus 값으로 반영
FlowJob
- Flow 내 Step 의 ExitStatus 값을 FlowExecutionStatus 값으로 저장
- 마지막 Flow 의 FlowExecutionStatus 값을 Job 의 최종 ExitStatus 값으로 반영
UNKNOWN, EXECUTING, COMPLETED, NOOP, FAILED, STOPPED
그 외 메서드
public Job batchJob() {
return jobBuilderFactory.get("batchJob")
.start(Flow)
.next(Step or Flow or JobExcecuitonDecider)
.on(String pattern)
.to(Step)
.stop() / fail() / end() / stopAndRestart()
.end()
.build();
}
on() : 어떤 조건이 충족되면
to() : 다음으로 실행할 단계를 지정
stop(), fail(), end() , stopAndRestart() :
- Flow를 중지 / 실패 / 종료하도록 Flow 종료
- stop()은 Job의 BatchStatus와 ExitStatus가 Stopped로 종료됨
- fail()은 Job의 BatchStatus와 ExitStaus가 FAILED로 종료됨.
- end()는 Job의 BatchStatus와 ExitStatus가 COMPLETED로 종료됨
- stopAndRestart 는 stop()과 비슷한 기본 흐름을 지니며, 특정 stp에서 작업을 중단하도록 설정하면 중단 이전의 Step만 COMPLETED로 저장되고 이후의 step은 실행되지 않고 STOPPED 상태로 Job이 종료된다.
사용자 정의 ExitStatus
- ExitStatus에 존재하지 않는 Exitcode를 새롭게 정의해서 설정
- StepExcecutionListener의 afterStp()메서드에서 Custom exictCode 생성 후 새로운 ExitStatus 반환
FlowJobArchitecture
1. JobLauncher가 JobParameters를 가지고, FlowJob실행함
2. FlowJob은 FlowExcecutor를 가지고 job을 실행함.
3. FlowExcecutor가 SimpleFlow 실행함
4. State 라는 각각의 항목을 SimpleFlow가 가지고 있으며 실행
5. FlowExcecutionStatus를 FlowExcecution에 업데이트 함.
6. 이후 JobListener의 afterJob()메서드가 실행됨.
7. JobExcecution은 마지막 FlowExcectionStatus상태로 업데이트함.
SimpleFlow
- 스프링 배치에서 제공하는 Flow의 구현체
- Step, Flow, JobExceutionDecider등을 담고 있는 State를 실행시키는 도메인 객체임
- FlowBuilder를 사용해서 생성하며, Transition과 조합하여 여러 개의 Flow 및 중첩 Flow를 만들어 Job을 구성함
0 flow안에 Step을 구성하거나 Flow를 중첩되게 구성할 수 있음.
public Job batchJob() {
return jobBuilderFactory.get("flowJob")
.start(flow1())
.on("COMLETED").to(flow2())
.end()
.build();
}
SimpleFlow 아키텍처
StateTransition은 state에서 다음 state로 가는 것을 매니징 해주는 역할을 하고,
SimpleFlow가 이러한 State를 List로 지니고 있어, 어디로 가야할지 결정하게 된다.
=> StateMap에 저장되어있는 모든 State들의 handle메서드를 호출해서 모든 Step들이 실행되도록 함.
FlowStep
- Step내에 Flow를 할당하여 실행시키는 도메인 객체
- flowStep의 BatchStatus와 ExitStatus는 Flow의 최종 상태값에 따라 결정됨
public Step flowStep() {
return stepBuilderFactory.get("flowStep")
.flow(flow())
.build();
}
JobScope / StepScope
- Scope : 스프링 컨테이너에서 빈이 관리되는 범위 (기본은 singleton)
- @JobScope, @StepScope 어노테이션이 붙은 빈 선언은 내부적으로 빈의 Proxy 객체가 됨
-
Spring Batch Scope
- Job, Step의 빈 생성 및 실행에 관여하는 Scope
- 프록시 모드를 기본 값으로 가지는 Scope
=> 해당 스코프가 선언되면 빈의 생성이 애플리케이션 구동 시점이 아닌 Bean의 실행시점에 이루어짐
=> Scope를 통 생성시점을 지연시켜 바인딩이 이루어지게 함
=> @Values 를 통해 빈의 실행 시점에 값을 참조할 수 있게 함.
@JobScope
- Step 선언문에 정의
- @Value: jobParameter, jobExceutionContext만 사용 가능함
@StepScope
- Tasklet이나 ItemReader, ItemWriter, ItemProcessor 선언문에 사용 가능
- @Value : jobParameter, jobExcecutionContext, stepExcecutionContext에 사용 가능
'Spring' 카테고리의 다른 글
Spring Batch - ItemReader (0) | 2024.06.29 |
---|---|
Spring Batch - Chunk (0) | 2024.06.22 |
스프링 배치 - Job / Step (0) | 2024.06.05 |
Spring Batch - 개요, 도메인 이해 (0) | 2024.05.26 |
Spring AOP vs AspectJ (0) | 2023.11.21 |