스프링 배치 Step Flow 시나리오

스프링 배치 Step Flow 시나리오

기본적인 Step Flow

  • 스프링 배치 Step의 Flow는 각 Step의 Status에 따라 진행됩니다.
  • 기본적으로 Step이 성공하면 다음 Step으로 넘어가고, Step이 실패하면 Job이 실패합니다.
  • 조금더 복잡한 시나리오로 다뤄보면, Step A가 성공하면 Step B를, 실패하면 Step C를 실행할 수 있습니다.
    • 다음 예시는 방금 언급한 시나리오를 xml 설정으로 나타낸 것입니다.
    • on 속성은 StepExecution의 ExiteStatus와 매칭되는 값이 들어가는데,
      • <next on="*" to="stepB" />는 어떤 상태든지 Step B로 이동한다는 의미이고
      • <next on="FAILED" to="stepC" />는 FAILED 상태이면 Step C로 이동한다는 의미다.
      • 이렇게만 보면 무조건 *가 먼저 선언되었으므로 항상 Step B로 이동하나 생각할 수 있는데, 실제로는 스프링 배치가 구체적으로 명시한 것부터 체크하여 FAILED 상태인 경우에는 Step C로 이동하게 됩니다.
    <job id="job">  
        <step id="stepA">  
        <next on="*" to="stepB" />  
        <next on="FAILED" to="stepC" />  
        </step>  
    </job>
    
  • 이보다 더 자세한 Step Flow를 이해하기 위해서는 먼저 스프링 배치의 Job, Step의 Status을 알아보겠습니다.

Job과 Step의 Status

Batch Status

  • JobExecution과 StepExecution의 속성으로, Job과 Step의 상태를 의미합니다.
  • Status 값으로는 OMPLETED, STARTING, STARTED, STOPPING, STOPPED, FAILED, ABANDONED or UNKNOWN 가 있습니다.

Exit Status

  • Job과 Step의 Execution이 끝난 후의 상태를 의미하며, 위에서 언급했듯이 Step의 시나리오 흐름에 영향을 미치는 상태 값입니다.
    • on 속성에 매칭되는 값.
  • 기본적으로 exit status 값은 batch status 값과 항상 동일합니다.
  • 왜 두개로 나누어 관리하는지는 아래에서 설명하겠습니다.

Job Status와 Step Status

  • 기본적으로 마지막 Step의 ExitStaus가 FAILED면, Job의 BatchStatus와 ExitStatus가 FAILED,
  • 그렇지 않으면 Job의 BatchStatus와 ExitStatus는 COMPLETED입니다.
  • 지금까지 말한 시나리오는 성공이면 COMPLETED 실패면 FAILED로 일반적인 흐름입니다.
  • 그런데, 실제로는 배치 중간에 Job을 중간에 중지하고싶은 시나리오가 있을 수 있으니 이에 대해 알아보겠습니다.

Job Stop 시나리오

  • 스프링 배치는 이와같은 Job을 중간에 중지할 수 있는 시나리오를 위해 next 이외에 3가지의 element를 제공합니다.

End element

  • End element는 Job의 BatchStatus를 COMPLETED로 설정하여 작업을 중지할 수 있습니다.

    • Job ExitStatus 또한 COMPLETED로 설정되겠지만, exit-code를 통해 커스터마이징 할 수 있습니다.
    • 아래 예제에서 Step2를 보면, Step2의 ExitStatus가 FAILED면 Job의 Status들을 COMPLETED로 중지하고, 그렇지 않으면 Step3으로 넘어갑니다.
    <step id="step1" next="step2">  
    ​</step>
      
    <step id="step2">  
        <end on="FAILED"/>  
        <next on="*" to="step3"/>  
    </step>  
    ​  
    <step id="step3">
    </step>
    
  • 한가지 더 주의할 점은 Job의 BatchStatus가 COMPLETED로 중지되기때문에 재시작될 수 없다는 점입니다.

    public JobExecution createJobExecution(String jobName, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException {  
        if (jobInstance == null) {  
            ...  
        } else {  
            ...  
            
            while(true) {  
                BatchStatus status = execution.getStatus();  
                
                if (execution.getJobParameters().getParameters().size() > 0 && (status == BatchStatus.COMPLETED || status == BatchStatus.ABANDONED)) {  
                    throw new JobInstanceAlreadyCompleteException(...);  
                }  
            }  
        }  
        ...  
    }
    

Fail Element

  • End element와 다르게 Job의 BatchStatus를 FAILED로 설정하여 작업을 중지할 수 있습니다.
    • 마찬가지로 Job ExitStatus 또한 FAILED로 설정되겠지만, exit-code를 통해 커스터마이징 할 수 있습니다.
  • 또한, Job의 BatchStatus가 FAILED로 끝나기 때문에 재시작이 가능합니다.

Stop Element

  • stop element는 Job의 BatchStatus를 STOPPED로 설정하여 작업을 중지할 수 있습니다.
  • 위의 element들과 다르게, 재시작 스텝을 설정하는 restart 속성이 필수입니다.
    • 다음 예제를 보면, Step1이 COMPLETED로 끝나면, Job이 중지됩니다. 이후에 재시작 될 때는 Step2에서 시작합니다.
    <step id="step1" parent="s1">  
        <stop on="COMPLETED" restart="step2"/>  
    </step>  
    ​  
    <step id="step2" parent="s2"/>
    

댓글