이전 글에서 XML(In memeory) 설정 환경에서 Restart에 대해 다룬적 있다
이번에는 JDBC 환경에서 Restart했던 작업을 적어볼까한다.
Quartz의 실행 정보과 Batch의 실행 이력들이 전부다 DB 조회가 가능한 시점에서
최대한 DB에 대한 정보를 활용하고 싶었기에 이렇게 만들어 진 듯?
Job은 실행되고, 종료가 된다.
그렇다면 Job이 종료된 시점에서, 언제 어떠한 방법으로 실패가 되었는지 알아차릴 수 있을까?
Batch_
테이블 조회
BATCH_JOB_EXECUTION
과 BATCH_STEP_EXECUTION
테이블을 조회 하면 시작, 종료 시간 및 종료된 상태, 에러 내용도 확인할 수 있다.
JobListenerSupport
사용
jobWasExecuted
를 사용하면 Job이 종료된 이후에 호출되기 때문에 메타 테이블을 조회가 가능하다
보통 Listener
는 공통으로 공유를 하고, 스케줄러를 통해 실행되는 Job이 한두 개가 아닌데 동일한 Error
로 재 시작하면 안될 것 같은데.....
QRTZ_JOB_DETAILS
사용
JOB_DATA
를 통해 key, value를 통해 값 기입
key: RESTART, value: 재 시작 기간
JobParameter
이용
JobParameters params = new JobParametersBuilder()
.addString("JobData", JobData)
.toJobParameters();
jobLauncher.run(job, params);
JobParameter
에 값을 넣어놓을 경우 각 Context
의 정보로 접근이 가능하다.
Job 또는 Step이 실행 중에 Error
가 발생하면 모두 재 시작을 해야할까?
Exception
은 다양한 이유로 발생할 수 있다. 특정한 원인일 때만 재 시작을 하고 싶었다.
StepExecutionListenerSupport
afterStep
을 통해 종료된 Step에서 getFailureExceptions
를 통해 처리afterStep
는 ExitStatus
를 반환을 합니다.
재 시작이 필요한 Exception
에 대해서는 RESTART
로 처리해 DB 조회 시 구분을 쉽게 했습니다.
public static final String STEP_EXITSTATUS_RESTART = "RESTART";
-- 생락 --
public ExitStatus afterStep(StepExecution stepExecution) {
if(stepExecution.getFailureExceptions() 에러 분기 처리){
return new ExitStatus(STEP_EXITSTATUS_RESTART);
}
return stepExecution.getExitStatus();
}
저는 이부분에서 JOB_DATA에 RESTART
값이 있는지 분기 처리도 추가 했습니다.
재시작 주기에 대해서는 JOB_DATA에 저장된 정보를 가져오고
Context정보에 있는 JOB 실행 시간으로 만들어보자
TriggerBuilder
를 통해 제작 후, Scheduler
에 등록을 하면 QRTZ_TRIGGERS
테이블에 등록된걸 확인할 수 있다.
String restartDateTime = jobExecutionContext
.getFireTime()
.toInstant()
.atZone(ZoneId.of("Asia/Seoul"))
.toLocalDateTime()
.plusSeconds(JOB_DATA의 value값 기입)
.format(DateTimeFormatter.ofPattern("ss mm HH dd MM ? yyyy"));
Trigger trigger = TriggerBuilder
.newTrigger()
.forJob(jobName)
.withIdentity(jobID, 'restart')
.withSchedule(cronSchedule(restartDateTime))
.build();
jobExecutionContext.getScheduler().scheduleJob(trigger);
EXIT_CODE
변경Job 종료 후 DB조회 할려고 할때 Context
정보에는 PK 값이 없다
SimpleJobLauncher
구현을 할려 했지만 한두개를 만들어야할 사항이 아니여서 포기재실행 횟수에 대한 제한이 없음으로 이건 필요시 작업이 필요함
동일한 방법으로 Batch가 실패한 경우 Listener
에서 확인 후 알림 기능도 추가 했음
jobWasExecuted
파라미터에 JobExecutionException
을 활용해 볼려고 했지만 실패Bean
에 대한 개념이 없어서 NULL에러 고생함docs.spring.io
에서 쫌 찾아보고 했으면 좋았을껄.....지금 문서를 찾아보면 좋은 기능이 많이 나온듯
내 입맛대로 커스텀 한 덕분에 여러 기능을 더 쓸수있어서 난 좋았다