Controlling Step Flow


들어가며

이전에 우리는 Job이 n개의 Step으로 구성되어 있다는 것을 확인하였습니다.
Step은 일반적으로 순차적인 흐름으로 진행되지만, 조건에 따라 흐름을 제어할 수도 있습니다.
이번 포스팅에선 Step의 흐름 제어에 대해 알아보도록 하겠습니다.


Sequential Flow

일반적인 Step의 Flow입니다

@Bean
public Job job() {
    return this.jobBuilderFactory.get("job")
                .start(stepA())
                .next(stepB())
                .next(stepC())
                .build();
}
  • start() 메서드를 이용해 첫번째 Step을 호출합니다
  • next() 메서드를 이용해 다음 Step을 호출합니다
  • 우리는 Step이 A -> B -> C 순서로 진행되는 것을 쉽게 알 수 있습니다.

Conditional Flow

위 예제에서는 두가지 시나리오만 가능합니다

  1. Step이 성공하고 다음 Step이 실행됩니다
  2. Step이 실패하고, job이 실패됩니다

일반적으론 위의 flow로도 충분합니다.
하지만, Step이 실패할경우 job을 실패로 끝내기 보다
다른 Step을 호출한다면 어떻게 될까요???
아래의 Step flow를 확인 해보겠습니다

@Bean
public Job job() {
    return this.jobBuilderFactory.get("job")
                .start(stepA())
                    .on("*")
                    .to(stepB())
                .from(stepA())
                    .on("FAILED")
                    .to(stepC())
                .end()
                .build();
}
  • Step A가 성공할 경우 StepB가 실행됩니다.
  • Step A가 실패할 경우 StepC가 실행됩니다.

메서드가 직관적이기 때문에 무엇을 의미하는지 알 수 있습니다.
좀더 정확한 의미를 알기 위해 위의 코드를 잠시 살펴보겠습니다.

  • start()
    • Job의 Step 구성으로부터 시작할 Step을 정의
  • on()
    • ExitStatus를 Catch
    • '*'는 모든 ExitStatus를 정의
    • Status는 BatchStatus가 아닌 ExitStatus가 온다!!!
  • to()
    • 다음으로 이동할 Step을 정의
  • from()
    • Step의 상태값을 보고 일치할경우 캐치
  • end()
    • FlowBuilder를 종료
      이렇듯, 약간의 코드 추가로 Step의 실패가 Job의 실패로 유도되지 않도록 설계할 수 있습니다.

ExitStatus 설정!!!

Job Flow를 설정하면서 가장 많은 실수를 하는 부분이 이 부분이 아닐까 합니다!!

return stepBuilderFactory.get("stepA")
    .tasklet((contribution, chunkContext) -> {
        //////////////////////////////////////////////
        contribution.setExitStatus(ExitStatus.FAILED);
        //////////////////////////////////////////////
        return RepeatStatus.FINISHED;
    })

on() 메서드가 캐치하는 상태값은 Batch Status가 아닌 Exit Status입니다.
따라서 Step의 Flow를 컨트롤할 경우 setExitStatus() 메서드를 통해 상태값을 정의해야 합니다!!

public void setExitStatus(ExitStatus status) {
    this.exitStatus = status;
}

참조

jojoldu님 블로그 - 4. Spring Batch 가이드 - Spring Batch Job Flow
spring.batch.io - Configuring a Step

#Spring/Batch/Step-flow

블로그 이미지

사용자 yhmane

댓글을 달아 주세요