스프링 배치 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"/>
댓글
댓글 쓰기