| 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://advenoh.tistory.com/51
'개발 > Spring' 카테고리의 다른 글
[Spring] 컴포넌트 ( Component ) 란 ? (0) | 2020.07.06 |
---|---|
[Spring] 스프링 트랜잭션 ( Transaction ) - 2 (0) | 2020.07.03 |
[Spring] 스프링 트랜잭션 ( Transaction ) - 1 (0) | 2020.07.03 |
[Spring] 전자정부 프레임워크 Exception , LeaveaTrace, AOP (0) | 2020.07.03 |
[Spring] AOP, Interceptor, Filter (0) | 2020.07.03 |
댓글