본문 바로가기
Java & Kotlin/Spring Batch

[Spring Batch] 스프링 배치 실행 - Flow

by heekng 2022. 5. 28.
반응형

스프링 배치의 실행 - 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와 매칭하는 것이 아니다.
    • patternExitStatus와 매칭되면 다음으로 실행할 Step을 지정할 수 있다.
    • *: 0개 이상의 문자와 매칭, 모든 ExitStatus와 매칭
    • ?: 정확히 1개의 문자와 매칭
  • to(): 다음으로 실행할 단계 지정
  • from(): 이전 단계에서 정의한 Transition을 새롭게 추가 정의
  • stop(): FlowExecutionStatusSTOPPED 상태로 종료되는 transition
    • Job의 batchStatusExitStatusSTOPPED로 종료된다.
  • fail(): flowExecutionStatusFAILED 상태로 종료되는 transition
    • Job의 batchStatusExitStatusFAILED로 종료된다.
  • end(): flowExecutionStatusCOMPLETED 상태로 종료되는 transition
    • Job의 BatchStatusExitStatusCOMPLETED으로 종료된다.
    • Step의 ExitStatusFAILED이더라도 Job의 BatchStatusCOMPLETED로 종료하도록 가능하며 이 때 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를 할당하여 실행시키는 도메인 객체
  • flowStepBatchStatusExitStatus는 Flow의 최종 상태값에 따라 결정된다.
반응형