본문 바로가기
개발/Spring

[Spring] Quartz 란 ( Quartz Scheduler )

by KIMECK 2020. 7. 6.
반응형

| Quartz 란 

Quartz는 Terracotta 라는 회사에서 의해 개발된 Job Scheduling 라이브러리입니다. 완전히 자바로 개발되어 어느 자바 프로그램에서도 쉽게 통합해서 개발할 수 있습니다.
Quartz는 수십에서 수천 개의 작업도 실행 가능하며 간단한 interval 형식이나 Cron 표현식으로 복잡한 스케줄링도 지원합니다. 예를 들면 매주 실행하는 작업이나 매월 마지막 날에 실행하는 작업도 지정할 수 있습니다.

| Quartz 장단점

장점

 - DB 기반으로 스케줄러 간의 Clustering 기능을 제공한다

 - 시스템 Fail-over와 Random 방식의 로드 분산처리를 지원한다

 - In-memory Job Scheduler도 제공한다

 - 여러 기본 Plug-in을 제공한다

 - ShutdownHookPlugin - JVM 종료 이벤트를 캐치해서 스케줄러에게 종료를 알려준다

 - LoggingJobHistoryPlugin - Job 실행에 대한 로그를 남겨 디버깅할 때 유용하게 사용할 수 있다

 

단점

 - Clustering 기능을 제공하지만, 단순한 random 방식이라서 완벽한 Cluster 간의 로드 분산은 안된다

 - 어드민 UI을 제공하지 않는다

 - 스케줄링 실행에 대한 History는 보관하지 않는다

 - Fixed Delay 타입을 보장하지 않으므로 추가 작업이 필요하다

 

   * Clustering :  여러 개체를 묶는 것 혹은 비슷한 개체끼리 묶는 것 

 

| Quartz Scheduler 설정 

1. pom.xml에 dependency 추가

<dependency>  
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId> 
  <version>2.3.0</version> 
</dependency>  

2. 로직을 처리할 Job 클래스 생성

 - QuartzJobBean을 extends 하게 되면 executeInternal 메서드를 오버라이드 하게 되어있습니다.

   > 스케쥴러에 의해 Job 클래스가 호출되었을 때 해당 메서드가 실행 < 

package kwrd.cloud.util;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

/**
 *스케쥴 Job 실행 클래스
 */
public class CloudJobExecutor extends QuartzJobBean {

	@Override
	protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
		// TODO Auto-generated method stub
		// 실제 수행할 로직..
	}

}

3. 스프링 설정 파일(Spring Quartz) 설정

context-quartz.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	
	<!-- <bean name="wordCloudJob" class="org.springframework.scheduling.quartz.JobDetailBean"> Quartz 1.8.x버전-->
	<bean name="wordCloudJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><!-- Quartz 2.x 버전 -->
		<property name="jobClass">
			<value>kwrd.cloud.util.CloudJobExecutor</value>
		</property>
	</bean>
	
	<!-- <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> Quartz 1.8.x 버전-->
	<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><!-- Quartz 2.x 버전 -->
		<property name="jobDetail">
			<ref bean="wordCloudJob"/>
		</property>
		<property name="cronExpression">
			<!-- 매  5분마다 실행 --> 
			<!-- <value>0 0/5 * * * ?</value> -->
			<!-- 매일 오후 3시 20분마다 실행  -->
			<value>0 20 15 * * ?</value>
		</property>
	</bean>
	
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref local="cronTrigger"/>
			</list>
		</property>
	</bean>
</beans>

| Cron 표현식 ( Cron Expression )

 

 - Job을 수행할 시간을 Cron 표현식으로 사용

 ex) 10분 마다 실행 :  0 0/10 * * * *

      1시간 마다 실행 : 0 0 0/1 * * *

 

- Cron Expression의 특수문자

* 모든 수를 나타냅니다.
- 값의 사이를 의미합니다. "* 10-13 * * * *" 10,11,12,13분에 동작합니다.
, 특정값 지칭합니다. "* 10,11,13 * * * *" 10,11,13분에 동작합니다.
/ 값의 증가를 표현합니다. "* 0/5 * * * *" 0분부터 시작해서 5분마다 동작합니다.
? 특별한 값이 없음을 나타냅니다.(day-of-month, day-of-week 필드만 사용) 일, 요일에 하나만 설정할때 나머지에 지정합니다.
L 마지막 날을 나타냅니다.(day-of-month, day-of-week 필드만 사용). 일 필드에 사용되면 이달의 마지막일을 나타냅니다. L-3 은 이달의 마지막날 3일 전부터 마지막날까지를 나타냅니다. 요일 필드에 사용되면 토요일(7 or SAT)을 나타냅니다. 6L or FRIL 은 이달의 마지막 금요일을 나타냅니다.
W 주어진 날로부터 가장 가까운 평일(월 - 금)을 나타냅니다. 15W 를 일 필드에 사용하면 이달의 15번째 날에서 가장 가까운 평일을 나타냅니다.
# 이달의 n번째 x 요일 을 나타냅니다. 6#3 or FRI#3 은 이달의 세번째 금요일을 나타냅니다.




 

 

출처:

https://junspapa-itdev.tistory.com/18

https://offbyone.tistory.com/256 [쉬고 싶은 개발자]

https://velog.io/@kihwanyu

https://advenoh.tistory.com/51

 

 

반응형

댓글