본문 바로가기
개발/Spring

[Spring Batch] Chunk 기반의 Job 은 어떤 기준으로 작업을 끝낼까 ?

by 상용최 2021. 12. 29.
반응형

필자는 Spring Batch 를 이용하여 배치 프로그램을 만드는 업무를 시작하였다.

아래와 같은 동작을 하는 간단한 배치프로그램이었다.

  1. Reader 로 데이터읽기
  2. Processor 로 데이터 처리하기
  3. Writer 로 데이터 적재하기

굉장히 쉬울줄만 알았던 업무였으나 예상하지 못한 곳에서 막히고 말았다.

Job 을 끝내야 하는데 어떤기준으로 끝나는지 알지 못했다.

그래서 Spring Batch 를 간단하게나마 분석하다가 알게된 내용을 공유하고자 이 글을 쓴다.

 

Chunk 기반의 Job 은 별다른 설정을 하지 않는다면 SimpleChunkProvider 에 의해 동작하게 된다.

SimpleChunkProvider.provider -> SimpleChunkProvider.read() -> SimpleChunkProvider.doRead() 의 순서대로 진행을 하게 된다.

 

필자가 궁금했던 Job 을 끝내는 기준은 SimpleChunkProvider.provider 에서 알 수 있었다.

 

아래는 SimpleChunkProvider 의 provider 메소드의 내용이다.

public Chunk<I> provide(final StepContribution contribution) throws Exception {

   final Chunk<I> inputs = new Chunk<>();
   repeatOperations.iterate(new RepeatCallback() {

      @Override
      public RepeatStatus doInIteration(final RepeatContext context) throws Exception {
         I item = null;
         Timer.Sample sample = Timer.start(Metrics.globalRegistry);
         String status = BatchMetrics.STATUS_SUCCESS;
         try {
            item = read(contribution, inputs);
         }
         catch (SkipOverflowException e) {
            // read() tells us about an excess of skips by throwing an
            // exception
            status = BatchMetrics.STATUS_FAILURE;
            return RepeatStatus.FINISHED;
         }
         finally {
            stopTimer(sample, contribution.getStepExecution(), status);
         }
         if (item == null) {
            inputs.setEnd();
            return RepeatStatus.FINISHED;
         }
         inputs.add(item);
         contribution.incrementReadCount();
         return RepeatStatus.CONTINUABLE;
      }

   });

   return inputs;

}

내용을 보다보면 아래와 같은 코드가 있다.

if (item == null) {
  inputs.setEnd();
  return RepeatStatus.FINISHED;
}

 

이 코드에서 reader 의 결과가 null 일때 Job 을 끝내는 것을 알 수 있다.

반응형

댓글