스케쥴러(Scheduler)란?
특정한 시간에 등록한 작업을 자동으로 실행시키는 것
spring에서 scheduler는 대표적으로 2가지 방식을 제공한다. Spring Scheduler와 Quartz
Spring Scheduler
Spring Framework에서 기본으로 제공하는 Scheduler로 추가적인 의존(dependency) 설정이 불필요하다
@Component와 @Scheduled 어노테이션을 이용하여 사용이 쉽다.
기본적으로 1개의 Thread를 사용하여 동기 형식으로 진행 (@EnableAsync를 이용하여 비동기 형식으로도 사용 가능)
@Slf4j
@Component
@RequiredArgsConstructor
public class testScheduler {
private final Job job;
private final JobLauncher jobLauncher;
// @Scheduled(cron = "${cron}")
@Scheduled(cron = "0/10 * * * * *")
public void testJob() {
try {
jobLauncher.run(job,
new JobParametersBuilder()
.addString("datetime",
LocalDateTime.now().toString())
.toJobParameters()
);
} catch (JobExecutionAlreadyRunningException e) {
log.error("DAILY_DATA JobExecutionAlreadyRunningException: {}", e.getMessage());
throw new RuntimeException(e);
} catch (JobRestartException e) {
log.error("DAILY_DATA JobRestartException: {}", e.getMessage());
throw new RuntimeException(e);
} catch (JobInstanceAlreadyCompleteException e) {
log.error("DAILY_DATA JobInstanceAlreadyCompleteException: {}", e.getMessage());
throw new RuntimeException(e);
} catch (JobParametersInvalidException e) {
log.error("DAILY_DATA JobParametersInvalidException: {}", e.getMessage());
throw new RuntimeException(e);
}
}
}
Quartz
Quartz는 Spring에서 기본으로 제공해주지 않기 때문에 라이브러리 의존(dependency) 설정이 필요
(implementation "org.springframework.boot:spring-boot-starter-quartz")
cron 표현식만 사용 가능하다 (fixedDelay 타입을 보장하지 않아 추가 작업 필요)
상대적으로 사용법이 어렵다.
Quartz 사용 이유
메모리 기반의 스케줄러뿐만이 아닌 DB 기반의 스케줄러 지원하기 때문에 다중 서버 간 스케줄링이 가능
즉, DB를 기반으로 클러스터링(Clustering) 기능을 제공
고가용성 (High Availability)
한 서버가 셧다운 되더라도 다른 서버에 의해 Job이 실행되어 다운 타임이 없음
확장성 (Scalability)
Quartz 설정된 서버를 구동하면 자동으로 DB에 스케줄 인스턴스로 등록된다
셧다운 된 서버는 다른 서버에 의해서 DB에서 삭제된다
로드 밸런싱 (Load balancing)
Cluster 구성으로 여러 Job이 여러 서버에 분산되어 실행된다
단, Quartz에서는 최소한의 구현으로 random 알고리즘만을 제공한다
Quartz 사용 용어
JobDataMap - 스케쥴러에서 job이 실행될 때 사용할 변수 값을 전달하는데 사용
JobDetail - job을 실행시키기 위한 정보를 담고있는 객체(이름, 그룹, jobDataMap 속성 등을 지정)
Trigger가 job을 수행 할 때 이 정보를 기반으로 실행
Trigger - job을 실행시킬 스케줄링 조건 (반복 횟수, 시간 등)
-> SimpleTrigger - 단순 반복 횟수와 실행등을 지정
CronTrigger - cron 표현식으로 Trigger를 정의
Listener - scheduler의 이벤트를 받을 수 있도록 Quartz에서 제공하는 인터페이스
-> JobListener - job 실행 전후로 이벤트를 받을 수 있음
TriggerListener - trigger가 발생하거나, 실패, 완료하였을 때 이벤트를 받을 수 있음
'Spring' 카테고리의 다른 글
| Spring batch + 스케쥴러 사용 예제 (0) | 2022.12.06 |
|---|---|
| 스프링 부트 - JPA 연동 (0) | 2022.12.05 |
| 스프링 부트 - MyBatis 연동 (0) | 2022.12.04 |
| 스프링 부트 - Validator 검증 (0) | 2022.10.26 |
| 스프링 부트 - 의존 주입 (0) | 2022.10.25 |