반응형

안녕하세요.

이번 시간에는 스프링 배치(spring batch)의 job 과 step이 실행 되었을 때, 상태 확인 및 무언가 작업을 추가하기 위한 리스너 사용법을 학습하겠습니다.

 

잡 리스너는 JobExecutionListener를 반환하는 메소드를 만들고 Job에 listener로 등록을 해주시면 되는데요.

아래 코드를 보도록 하겠습니다.

@Bean
public Job advancedJob(JobExecutionListener jobExecutionListener,
                       Step advancedStep) {
    return jobBuilderFactory.get("advancedJob")
            .incrementer(new RunIdIncrementer())
            .validator(new LocalDateParameterValidator("targetDate"))
            .listener(jobExecutionListener)
            .start(advancedStep)
            .build();
}

@JobScope
@Bean
public JobExecutionListener jobExecutionListener() {
    return new JobExecutionListener() {
        @Override
        public void beforeJob(JobExecution jobExecution) {
            log.info("[JobExecutionListener#beforeJob] jobExecution is " + jobExecution.getStatus());
        }

        @Override
        public void afterJob(JobExecution jobExecution) {
            if (jobExecution.getStatus() == BatchStatus.FAILED) {
                log.error("[JobExecutionListener#afterJob] jobExecution is " + jobExecution.getStatus());
            }

            log.info("[JobExecutionListener#afterJob] jobExecution is " + jobExecution.getStatus());
        }
    };
}

jobExecutionListener() 메소드를 만들고 JobExecutionListener를 반환합니다. 리스너를 통해서 필요로 하는 작업을 구현 해주셔야 되는데요. job이 실행되기 전에는 beforeJob이 실행이 되고 job이 끝난 이후에는 aftetJob이 실행이 되겠습니다.

데이터베이스에 실행 결과를 쌓아 줄 수도 있고, 잡이 끝난 후에 배치 상태가 오류가 발생하였다면 텔레그램이나 슬렉같은 메신저로 알람을 받아 볼 수 있도록 구현을 해주 실 수도 있겠습니다.

 

step의 작업의 리스턴도 job과 유사합니다.

@JobScope
@Bean
public Step advancedStep(StepExecutionListener stepExecutionListener,
                         Tasklet advancedTasklet) {
    return stepBuilderFactory.get("advancedStep")
            .listener(stepExecutionListener)
            .tasklet(advancedTasklet)
            .build();
}

@StepScope
@Bean
public StepExecutionListener stepExecutionListener() {
    return new StepExecutionListener() {
        @Override
        public void beforeStep(StepExecution stepExecution) {
            log.info("[StepExecutionListener#beforeStep] stepExecution is " + stepExecution.getStatus());
        }

        @Override
        public ExitStatus afterStep(StepExecution stepExecution) {
            log.info("[StepExecutionListener#afterStep] stepExecution is " + stepExecution.getStatus());
            return stepExecution.getExitStatus();
        }
    };
}

StepExecutionListener를 반환하하는 메소드를 만들고 step설정에 listener를 등록 해주시면 되겠습니다.

#beforeJog이 실행이 되고 step 작업 후에 마지막으로 #afterJob이 실행이 되는 모습을 보실 수 있겠습니다.

반응형

+ Recent posts