Spring

Spring Scheduler 정리 (Spring Scheduler, Quartz)

Clearing 2023. 2. 13. 12:05
728x90

스케쥴러(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가 발생하거나, 실패, 완료하였을 때 이벤트를 받을 수 있음

728x90

'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