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
- 자세한 코드는 위의 링크 들어간 후 1. default spring batch api project에서 확인할 수 있습니다.
728x90
'Programing > Java & Spring' 카테고리의 다른 글
세무민의 코딩일기 : Junit > Port was already in use 해결 방법 (2) | 2024.02.27 |
---|---|
세무의 코딩일기 : JobRegistry @Autowird Bean이 없다고 오류 날 때 처리 방안 (0) | 2024.02.02 |
세무민의 코딩일기 : Spring Batch JobParameterVaildator (0) | 2023.11.28 |
세무민의 코딩일기 : Spring Batch API 만들기 2탄(Job, Step, TaskLet를 직접 사용해보자) (0) | 2023.10.30 |
세무민의 코딩일기 : Spring Batch API 만들기 1탄(Spring Batch, Scheduler, TaskLet, Chunk등 이론 정리) (0) | 2023.10.29 |