반응형
스프링 배치의 실행 - Flow
FlowJob
@Bean
public Job batchJob() {
return jobBuilderFactory.get("batchJob")
.start(step1())
// step1이 성공한다면 step3 실행
.on("COMPLETED").to(step3())
// step1이 실패한다면 step2 실행
.from(step1())
.on("FAILED").to(step2())
.end()
.build();
}
- Step을 순차적으로만 구성하는 것이 아닌 상태에 따라 흐름을 전환하도록 구성할 수 있으며 FlowJobBuilder에 의해 생성된다.
- Step이 실패하더라도 Job은 실패로 끝나지 않도록 해야 하는 경우
- Step이 성공했을 때 다음에 실행해야 할 Step을 구분해서 실행해야 하는 경우
- 특정 Step은 전혀 실행되지 않게 구성해야 하는 경우
- Flow와 Job의 흐름을 구성하는 데만 관여하고 실제 비즈니스 로직은 Step에서 이루어진다.
- 내부적으로 SimpleFlow 객체를 포함하고 있으며 Job 실행 시 호출한다.
- 단순한 Step으로 생성하는 SimpleJob보다 다양한 Flow로 구성하는 FlowJob의 생성 구조가 더 복잡하고 많은 API를 제공한다.
API
start(Step)
: Flow를 시작하는 Step을 설정한다.on(String pattern)
: Step의 실행 결과로 돌려받는 ExitStatus를 캐치하여 매칭하는 패턴, TansitionBuilder을 반환한다.- on 메서드를 호출하게 되면 TransitionBuilder가 작동하며 Step간에 조건부 전환을 구성할 수 있게 된다.
to(Step)
: 다음으로 이동할 Step을 지정한다.stop(), fail(), end(), stopAndRestart()
: Flow를 중지, 실패, 종료하도록 Flow를 종료,FlowBuilder
반환
from(Step)
: 이전 단계에서 정의한 Step의 Flow를 추가적으로 정의한다.next(Step)
: 다음으로 이동할 Step을 지정한다.end()
:build()
앞에 위치하면FlowBuilder
를 종료하고SimpleFlow
객체를 생성한다.build()
: FlowJob을 생성하고 Flow 필드에 SimpleFlow를 저장한다.
Transition
@Bean
public Job batchJob() {
return jobBuilderFactory.get("batchJob")
.start(step1())
.on("FAILED")
.to(step2())
.on("FAILED")
.stop()
.from(step1())
.on("*")
.to(step3())
.next(step4())
.from(step2())
.on("*")
.to(step5())
.end()
.build();
}
- Flow 내의 Step의 조건부 전환을 정의한다.
- Job의 API 설정에서
on(String pattern)
메서드를 호출하면 TransitionBuilder가 반환되어 Transition Flow를 구성할 수 있다. - Step의 ExitStatus가 어떤 pattern과도 매칭되지 않으면 스프링 배치는 예외를 발생시키고 Job은 실패한다.
- transition은 구체적인 것부터 그렇지 않은 순서로 적용된다.
API
on(String pattern)
- Step의 실행 결과로 돌려받는
ExitStatus
와 매칭하는 패턴 스키마,BatchStatus와 매칭하는 것이 아니다
. pattern
이ExitStatus
와 매칭되면 다음으로 실행할 Step을 지정할 수 있다.*
: 0개 이상의 문자와 매칭, 모든ExitStatus
와 매칭?
: 정확히 1개의 문자와 매칭
- Step의 실행 결과로 돌려받는
to()
: 다음으로 실행할 단계 지정from()
: 이전 단계에서 정의한Transition
을 새롭게 추가 정의stop()
:FlowExecutionStatus
가STOPPED
상태로 종료되는 transition- Job의
batchStatus
와ExitStatus
가STOPPED
로 종료된다.
- Job의
fail()
:flowExecutionStatus
가FAILED
상태로 종료되는 transition- Job의
batchStatus
와ExitStatus
가FAILED
로 종료된다.
- Job의
end()
:flowExecutionStatus
가COMPLETED
상태로 종료되는 transition- Job의
BatchStatus
와ExitStatus
가COMPLETED
으로 종료된다. - Step의
ExitStatus
가FAILED
이더라도 Job의BatchStatus
가COMPLETED
로 종료하도록 가능하며 이 때 Job의 재시작은 불가능하다.
- Job의
stopAndRestart(Step or Flow or jobExecutionDecider)
- stop() transition과 흐름은 동일하다.
- 특정 Step에서 작업을 중단하도록 설정하면 중단 이전의 Step만 COMPLETED로 저장되고 이후의 Step은 실행되지 않고 STOPPED상태로 Job을 종료한다.
- Job이 다시 실행됐을 때 실행해야 할 step을 restart인자로 넘기면 이전에 COMPLETED로 저장된 step은 건너뛰고 중단 이후 step부터 시작한다.
SimpleFlow
@Bean
public Job batchJob() {
return jobBuilderFactory.get("batchJob")
.start(flow())
.next(step3())
.end()
.build();
}
- 스프링 배치에서 제공하는 Flow의 구현체로서 각 요소(Step, Flow, JobExecutionDecider)들을 담고 있는 State를 실행시키는 도메인 객체
- FlowBuilder를 사용해서 생성하며 Transition과 조합하여 여러 개의 Flow 및 중첩 Flow를 만들어 Job을 구성할 수 있다.
API
start(Flow)
: Flow를 정의해서 설정한다.on("COMPLETED").to(Flow())
: Flow를 Transition과 함께 구성한다.end()
: SimpleFlow 객체를 생성한다.build()
: FlowJob 객체를 생성한다.
FlowStep
private Step flowStep() {
return stepBuilderFactory.get("flowStep")
.flow(flow())
.build();
}
private Flow flow() {
FlowBuilder<Flow> flowBuilder = new FlowBuilder<>("flow");
flowBuilder.start(step1())
.end();
return flowBuilder.build();
}
- Step 내에서 Flow를 할당하여 실행시키는 도메인 객체
flowStep
의BatchStatus
와ExitStatus
는 Flow의 최종 상태값에 따라 결정된다.
반응형
'Java & Kotlin > Spring Batch' 카테고리의 다른 글
[SpringBatch] 멀티쓰레드 Step (0) | 2022.07.02 |
---|---|
[Spring Batch] @JobScope와 @StepScope (0) | 2022.05.28 |
[Spring Batch] 스프링 배치 실행 - Step (0) | 2022.05.28 |
[Spring Batch] 스프링 배치 실행 - Job (0) | 2022.05.28 |
[Spring Batch] 스프링 배치 도메인 - Step, 나머지 (0) | 2022.05.28 |
[Spring Batch] 스프링 배치 도메인 - Job (0) | 2022.05.28 |