Scheduler 설정 구조
@DependsOn({"..."})
@Configuration
public class ConfigScheduling {
@Bean
public JobDetail ...JobDetail(){
return JobBuilder.nowJob(잡.class)
.withIdentity(잡.class.getSimpleName())
.storeDurable(true)
.build();
}
@Bean
public Trigger ...JobTrigger(){
...
return trigger.newTrigger()
.withIdentity(잡.class.getSimpleName(), Scheduler.DEFAULT_GROUP)
.build();
}
}
@DependsOn
DB와 관련된 작업을 수행하기에, 스케쥴링 작업이 데이터 소스 초기화 작업 이후에 수행되도록 보장하기 위해 사용했다.
이 경우, DB 데이터 소스 초기화를 진행하는 클래스의 이름을 지정해주었다
JobDetail
Qurtz 스케쥴러에서 작업(Job)을 정의하는 데 사용하는 클래스이다
storeDurable(true)의 경우, 트리거가 없어도 삭제되지 않도록 설정하는 것이다.
예를 들어, 관리자가 버튼을 클릭하거나 이벤트가 발생한다면 스케쥴러를 통해 직접 실행해야 할 수도 있다. 이때 JobDetail이 삭제되지 않아야 하므로 영속성을 지정해준다.
Trigger
스케쥴링 규칙을 정의한다 반드시 연결한 JobDetail과 스케쥴을 설정해야한다
그래서 생략한 부분에는 아래와 같이 Cron설정 빈을 지정해준다
CronTriggerFactoryBean factoryBean = new CronTriggerFactoryBean();
factoryBean.setJobDetail(..JobDetail());
factoryBean.setCronExpression("0 0 0/1 * * ?");
factoryBean.afterPropertiesSet();
Trigger trigger = factoryBean.getObject();
실제 Job 클래스 만들기
예시는 아래와 같다
@Service
public class ...Job implements Job {
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private ...Service service;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
log.info("[...Job] execute");
transactionTemplate.execute(status -> {
try {
service.delete...();
} catch (Exception e) {
log.info("[DeleteUnMsgChatJob] execute err: {}", e.getMessage());
status.setRollbackOnly(); // 예외 발생 시 롤백
throw new ....; // 예외처리
}
return null;
});
}
}
Job 인터페이스 구현하기
Quartz의 Job 인터페이스를 구현한다. 이때 인터페이스를 따라 execute는 필수적으로 구현해야 한다
트랜잭션을 요구하는 작업이기에 어노테이션으로 적용했으며, 삭제작업을 수행하는 서비스 로직을 호추시킨다
롤백 설정도 같이 해주었으며, 이렇게 간단히 끝난다.