인프런 커뮤니티 질문&답변

kumjip님의 프로필 이미지
kumjip

작성한 질문수

스프링 배치

청크 프로세스 - StepExecution, ItemReadListener 질문

해결된 질문

작성

·

594

0

안녕하세요. 강의 수강하며 많은 도움이 되고 있습니다!

제가 현재 Spring Batch 로 배치 업무를 개발 중에 있는 데 질문이 있어 문의드립니다.

 

청크 프로세스를 사용하여 개발하면서 reader, processor, writer 로 구현하였을 때,

청크 단위로 데이터를 처리할 때 BATCH_STEP_EXECUTION 테이블에 실시간으로

reader 시에는 read_count 가. writer 시에는 write_count 가 청크 단위로 업데이트 되는 걸로 이해하고 있습니다.

 

문의 드리고자 하는 내용은 ItemReadListener(혹은 이외에 방법)를 통해서 StepExecution 객체를 불러와 readCount, writeCount, commitCount 등을 확인(로깅)하는 방법이 있을지 문의드립니다.

즉, 동일 Step 안에서 청크단위마다 reader() 메소드를 반복 수행할 때 StepExecution의 readCount 를 조회가 가능할 지 궁금합니다.

답변 2

1

정수원님의 프로필 이미지
정수원
지식공유자

답변이 늦어 죄송합니다

네 가능합니다. 대략 다음과 같이 하면 될 것 같습니다.

@Bean
public Step step1() {
    return stepBuilderFactory.get("step1")
            .<Customer, Customer>chunk(10)
            .reader(customItemReader())
            .writer(customItemWriter())
            .listener(new StepExecutionListener(){
                @Override
                public void beforeStep(StepExecution stepExecution) {
                    System.out.println("스텝을 시작합니다");
                }

                @Override
                public ExitStatus afterStep(StepExecution stepExecution) {
                    System.out.println("stepExecution = " + stepExecution.getReadCount());
                    return stepExecution.getExitStatus();
                }
            })
            .build();
}

StepExecutionListener 를 별도의 클래스로 만들어서 사용하셔도 됩니다.

kumjip님의 프로필 이미지
kumjip
질문자

안녕하세요! 확인해주셔서 감사합니다!

답변에 궁금한 점이 있어 추가로 문의드립니다.

 

위 코드 작성해주신 부분에서 StepExecutionListener() 를 사용할 경우에는 해당 step1 수행 전/후로만 listner 가 수행되고 chunk 단위로 reader()가 반복 수행될 때는 동작하지 않는 걸로 이해하고 있습니다.

1) chunk 단위로 reader() 가 반복 수행될 때에는 아래 인프런 AI 인턴님이 답변해주신대로 ItemReadListener 를 통해 readCount 조회가 가능할 것 같은데 잘못 이해한 것일까요?

 

2) 혹시 ItemReadListener 에서 StepExecution 을 가지고 오는 방법이 있을까요?

 

  • ChunkListener 를 통해 기존 문의는 해결 하였습니다.

1

안녕하세요 kumjip 님, 인프런 AI 인턴이에요.

ItemReadListener를 통해서 StepExecution 객체를 불러와서 readCount, writeCount, commitCount 등을 확인하는 방법이 있습니다. ItemReadListener는 Spring Batch에서 제공하는 리스너 중 하나로, ItemReader에서 아이템을 읽을 때 호출되는 메소드를 오버라이딩하여 사용할 수 있습니다.

즉, 아래와 같이 ItemReadListener 인터페이스를 구현하고 afterRead() 메소드 내에서 StepExecution 객체를 가져와서 원하는 정보를 확인할 수 있습니다.

public class CustomItemReadListener implements ItemReadListener<MyItem> {

    @Override
    public void beforeRead() {
        // 실행 전 동작
    }

    @Override
    public void afterRead(MyItem item) {
        StepExecution stepExecution = ((ChunkExecutionContext)ExecutionContextPromotionUtils
                .getExecutionContext().get(ExecutionContextPromotionUtils.SYNCHRONIZED_CHUNK_CONTEXT_KEY)).getStepContext().getStepExecution();
        int readCount = stepExecution.getReadCount();
        int writeCount = stepExecution.getWriteCount();
        int commitCount = stepExecution.getCommitCount();

        // readCount, writeCount, commitCount 사용
    }

    @Override
    public void onReadError(Exception ex) {
        // 읽기 도중 에러 발생 시 동작
    }
}

위와 같이 CustomItemReadListener를 구현한 후, 청크 단위마다 reader() 메소드를 반복 수행할 때, ItemReader에 CustomItemReadListener를 등록하면 StepExecution 객체를 가져와서 readCount, writeCount, commitCount 등을 확인할 수 있습니다. 이를 통해 원하는 정보를 로깅하거나 활용할 수 있습니다.

프로젝트에 맞게 Listener를 구현하고 등록하여 사용하시면 됩니다. 감사합니다!

kumjip님의 프로필 이미지
kumjip
질문자

안녕하세요! 확인해주셔서 감사합니다!

답변에 궁금한 점이 있어 추가로 문의드립니다.

말씀해주신 부분은 이해하였으나 ItemReadListener 에서 StepExecution 객체를 불러오는 방법을 열심히 찾아보았지만 모르겠어서 추가로 문의드립니다...

ItemReadListener 에서 StepExecution 을 가지고 오는 방법을 알 수 있을까요?

 

  • ChunkListener 를 통해 기존 문의는 해결 하였습니다.

kumjip님의 프로필 이미지
kumjip

작성한 질문수

질문하기