Programing/Java & Spring

세무민의 코딩일기 : Spring Batch JobListenerUtils 만들기

세기루민 2023. 12. 4. 14:26
728x90

안녕하세요.

세기무민입니다.

 

12월이 되면서 회사에서 프로젝트 오픈을 위해 정신없다보니 개인 포스팅을 할 시간이 없더라구요..ㅎ

다행히도 오늘 연차라서 심심하기도 하고 포스팅을 해보려고합니다.

 

JobListener

 

JobListener는 실제 Job과 Step이 실행할 때 이벤트를 알려주는 역할을 합니다. 

Job과 Step이 시작하거나 끝났을 때 호출되어 이벤트를 알려주는데 

로그 기록을 남기거나 실행 상태에 대해서 정보를 확인하는데에 도움을 주는 역할이다.

 

Listener 사용 방법

Listener는 다양한 방법으로 구현할 수 있는데 

JobExecutionListener와 StepExecutionListener를 이용하여 구현했다.

JobExecutionListener와 StepExecutionListener는 각각 beforeJob/Step afterJob/Step 메서드를 제공한다.

 

 

JobListenerUtils Code

JobListenerUtils.class

@Component
@Log4j2
public class BatchJobListenerUtils {
    
    @JobScope
    public JobExecutionListener jobExecutionListener() {
        return new JobExecutionListener(){
            @Override
            public void beforeJob(JobExecution jobExecution) {
                log.info("[Before JobExecution] jobStatus : {}, startDay : {}, jobName : {}, schedulerName : {}",
                    jobExecution.getStatus(),
                    jobExecution.getJobParameters().getString(BatchJobParameterType.JOBPARAMETER_START_DAY.getValue()),
                    jobExecution.getJobParameters().getString(BatchJobParameterType.JOBPARAMETER_JOB_NAME.getValue()),
                    jobExecution.getJobParameters().getString(BatchJobParameterType.JOBPARAMETER_SCHEDULER_NAME.getValue()));
            }

            @Override
            public void afterJob(JobExecution jobExecution) {
                log.info("[After JobExecution] jobStatus : {}, startDay : {}, jobName : {}, schedulerName : {}",
                    jobExecution.getStatus(),
                    jobExecution.getJobParameters().getString(BatchJobParameterType.JOBPARAMETER_START_DAY.getValue()),
                    jobExecution.getJobParameters().getString(BatchJobParameterType.JOBPARAMETER_JOB_NAME.getValue()),
                    jobExecution.getJobParameters().getString(BatchJobParameterType.JOBPARAMETER_SCHEDULER_NAME.getValue()));
            }
        };
    }

    @StepScope
    public StepExecutionListener stepExecutionListener() {
        return new StepExecutionListener() {
            @Override
            public void beforeStep(StepExecution stepExecution) {
                log.info("[Before StepExecution] stepStatus : {}", stepExecution.getStatus());
            }

            @Override
            public ExitStatus afterStep(StepExecution stepExecution) {
                log.info("[After StepExecution] stepStatus : {}, exitStatus : {} ",
                            stepExecution.getStatus(),
                            stepExecution.getExitStatus());
                return stepExecution.getExitStatus();
            }
        };
    }
}
  • 나는 JobExecutionListener와 StepExecutionListener를 이용하여 실행 전후에 이벤트를 로그로 기록하였다.
  • 별도의 DB 저장은 하지 않은 이유는 메타 테이블에 이미 상태값이 저장되어 있기도 하고 실제 이벤트 로그는 DB 조회하지 않고도 정상 처리 여부를 확인하기 위하여 로그로 남겨놓았다.
  • 추후 생명주기에 대한 추적을 위한다면 로그보다는 별도의 테이블에 Listener 기록을 남기는걸 추천한다.
    • 첨언하면 K8S 환경의 경우 제가 자세히 몰라서 그럴 수 있지만 Deployment 재 실행 시 Pod에 들어있던 로그 파일들이 날라가서.. 날라가지 않는다면 별도의 DB저장은 필요없다.

Job.class

  @Bean(name = "getMemberJob")
  public Job getMemberJob(){
      return jobBuilderFactory.get(BatchJobNameType.GET_MEMBER_JOB_NAME.getValue())
          .validator(batchJobParameterVaildationUtils)
          .listener(batchJobListenerUtils.jobExecutionListener())
          .start(memberStep.getMemberStep())
          .build();
  }
  • Job에서는 JobBuilderFactory에 Job등록 시 Listener를 추가해주면 된다.
    • Step도 StepBuilderFactory에 Listener를 추가하면 Step에 대한 이벤트 리스너를 동일하게 사용 가능

 

Result

  • Job이 실행될 때 Listener에 설정한 이벤트가 발생되는 것을 확인할 수 있습니다.

 

GitHub Link

 

GitHub - sg-moomin/springbatchapi

Contribute to sg-moomin/springbatchapi development by creating an account on GitHub.

github.com

  • 자세한 코드는 위의 링크 들어간 후 1. default spring batch api project에서 확인할 수 있습니다.
728x90