BackEnd/Spring Batch

[Spring Batch 정리하기] 6. Listener

Wonol 2024. 8. 6. 09:01
반응형

1. Listener(리스너)

1-1) 기본 개념

- 배치 흐름 중에 Job, Step, Chunk 단계의 실행 전후에 발생하는 이벤트

- 각 단계별로 로그기록을 남기거나 소요된 시간을 계산하거나 실행상태 정보들을 참조 및 조회 가능

- 사용하기 위해서는 Listener 를 등록해야 하며 등록은 각 API 설정에서 단계별로 지정 가능

1-2) 종류

  • Job
    - JobExecutionListner -> Job 실행 전후
  • Step
    - StepExecutionListener -> Step 실행 전후
    - ChunkListener -> Chunk 실행 전후(Tasklet 실행 전후), 오류 시점
    - ItemReaderListener -> ItemReader 실행 전후, 오류 시점(But, Item 이 Null 인 경우 호출 안 됨)
    - ItemProcessListener -> ItemProcessor 실행 전후, 오류 시점(But, Item 이 Null 인 경우 호출 안 됨)
    - ItemWriterListener -> ItemWriter 실행 전후, 오류 시점(But, Item 이 Null 인 경우 호출 안 됨)
  • SkipListener
    - 읽기, 쓰기, 처리 Skip 실행 시점, Item 처리가 Skip 될 경우 Skip 된 Item 을 추적
  • RetryListener
    - Retry 시작, 종료, 에러 시점

1-3) 구현 방법

  • 어노테이션 방식
    - 인터페이스를 구현할 필요 없음
    - 클래스 및 메소드명을 자유롭게 작성 가능
@Slf4j
public class CustomChunkListener {

    private static final int MAX_READ_COUNT = 15;

    @BeforeChunk
    public void beforeChunkMethod(ChunkContext context) {

    }

    @AfterChunk
    public void afterChunkTest(ChunkContext context) {

        StepExecution stepExecution = context.getStepContext().getStepExecution();
        int readCount = stepExecution.getReadCount();

        if (readCount > MAX_READ_COUNT) {
            log.error("최대 ReadCount 초과");
            throw new RuntimeException("최대 ReadCount 초과");
        }
    }

    @AfterChunkError
    public void afterChunkErrorCall(ChunkContext context) {

    }
}
  • 인터페이스 방식
@Slf4j
public class CustomChunkListener implements ChunkListener {

    private static final int MAX_READ_COUNT = 15;

    @Override
    public void beforeChunk(ChunkContext context) {

    }

    @Override
    public void afterChunk(ChunkContext context) {

        StepExecution stepExecution = context.getStepContext().getStepExecution();
        int readCount = stepExecution.getReadCount();

        if (readCount > MAX_READ_COUNT) {
            log.error("최대 ReadCount 초과");
            throw new RuntimeException("최대 ReadCount 초과");
        }
    }

    @Override
    public void afterChunkError(ChunkContext context) {

    }
}

1-4) 프로세스

1-5) 각 선언 방법 및 메소드 정보

- Listener 다중 선언 시 확인 필요

ex1: ChunkListener 와 ItemReaderListener 는 같이 동작하지 않음???
(정확한 원인은 잘 모르겠습니다만 예상하기로는 ChunkListener 다음으로 ItemReaderListener 가 동작하는데 이때 동일한 행위를 하기 때문이라고 추측)
ex2: ChunkListener 와 ItemProcessListener 는 같이 동작
ex3: ItemReadListener 와 ItemProcessListener 는 같이 동작
  • JobExecutionListener

  • StepExecutionListener

  • ChunkListener

  • ItemReaderListener

  • ItemProcessListener

  • ItemWriteListener


참고

- https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B0%B0%EC%B9%98/dashboard

반응형