TIL

[TIL] 2023.06.23

DevHyo 2023. 6. 23. 21:37

Spring Batch 복습

Spring Batch의 Step에서 Chunk 처리를 하다가 에서 예외로 인해 처리가 실패한 경우, Batch Job을 재실행하면 실패한 Chunk부터 처리된다는 것을 알게 되었다. Spring Batch Starter 버전은 3.1.0이며, Spring Batch Core 버전은 5.0.2이다.

단일 Step

chunkSize 값이 2이고 데이터가 10건이면, 2건씩 쪼개서 작업하기 때문에 총 5번을 통해 Batch 작업이 마무리된다. 근데 이때, 2번째 작업에서 실패한 경우, 재실행하면 2번째부터 이어서 작업한다.

파티셔닝 기반의 멀티 스레드 Step

파티셔닝 기반의 멀티 스레드로 Step을 병렬적으로 처리하는 경우에는 당연히 실패 지점부터 다시 처리되지 않을 줄 알았는데 단일 Step에서 테스트했던 조건과 동일하게 테스트해 봤다. ThreadPoolSize 값이 5인 상황에서 BATCH_STEP_EXECUTION 테이블을 통해 첫 번째로 실행한 결과를 확인해 보니 다음과 같았다.

 

  • 1번 Step의 경우, Completed
  • 2번 Step의 경우, Failed
  • 3번 Step의 경우, Completed
  • 4번 Step의 경우, Completed
  • 5번 Step의 경우, Completed
  • 1,2,3,4,5번을 관리하는 StepManager의 경우, Failed

다시 실행을 해본 다음 BATCH_STEP_EXECUTION 테이블에서 아래와 같은 결과를 확인할 수 있었다. 실패했던 2번의 Step이 Completed 상태가 되면서, StepManager도 Completed 상태로 2개의 레코드가 추가되었음을 확인했다.

 

  • 1번 Step의 경우, Completed
  • 2번 Step의 경우, Failed
  • 3번 Step의 경우, Completed
  • 4번 Step의 경우, Completed
  • 5번 Step의 경우, Completed
  • 1,2,3,4,5번을 관리하는 StepManager의 경우, Failed
  • 3번 Step의 경우, Completed
  • 1,2,3,4,5번을 관리하는 StepManager의 경우, Completed

아래의 테이블 결과를 보면, JOB_EXCUTION_ID 값이 43 인 데이터들 중에서 memberBatchPartitionStep:Partition-1과 Step들을 관리하는 StepManager만 실패했다는 것을 알 수 있으며, 다시 실행하면서 JOB_EXCUTION_ID 값이 44 인 데이터 2개가 추가되었다. 즉, memberBatchPartitionStep:Partition-1은 성공했으며, 이에 따라 StepManager도 성공했다는 것을 확인할 수 있었다.

처음에는 실패, 다시 실행 후 성공

정리

그동안 Spring Batch를 사용하면서, 잘 못 알고 있었던 지식을 바로 잡을 수 있었다.