Quartz 공식 사이트 : http://www.quartz-scheduler.org
어플리케이션을 개발시에 주기적인 배치를 위해 crontab아니 nt의 스켸줄링을 위해 스크립트를 많이 이용하였을 것입니다.
스크립트의 문제는 자바의 객체지향적인 요소 사용하기에 문제가 있고, spring 같은 잘 구축된 프레임워크를 재활용하지 못하며,
주 어플리케이션과의 연동성 분리로 인해 모니터링 및 제어가 쉽지 않습니다.
이에 따라 보통 어플리케이션에서 배치를 개발하기위해 java timer를 이용하여 개발들을 많이 합니다.
하지만 이 timer도 기능이 너무 빈약하고 불안정합니다. 그리고 특정시간에 실행을 하도록 설정하는 것도 어렵습니다.
그래서 cron 처럼 쉽게 설정하고 sping 및 기존 프레임워크에 붙여서 생산성을 높일 수 있는 Quartz를 제안합니다.
원리는 주기적으로 실행할 job과 특정시간 또는 주기를 관리하는 trigger로 구성 job을 객체로 생성하고 설정은 xml로
설정, 로그는 log4j를 이용하여 남김 SpringFraemework를 이용하여 개발
1. lib 등록
quartz-1.6.0\quartz-1.6.0.jar
quartz-1.6.0\lib 내에 jar들(필요시에 이용)
2. applicaiontContext.xml에 등록
<bean id="commonDao" class="com.sds.ist.glims.common.dao.ibatis.CommonDaoiBatis">
</bean>
<bean id="arriveBookMailJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.sds.ist.glims.schedule.service.ArriveBookMailManagerImpl" />
<property name="jobDataAsMap">
<map>
<entry key="commonDao">
<ref local="commonDao" />
</entry>
</map>
</property>
</bean>
<bean id="arriveBookMailTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="arriveBookMailJob" />
<!-- 매일 오전1시에 실행(cron과 유사) -->
<property name="cronExpression" value="0 0 1 * * ?" />
</bean>
<bean id="testTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="arriveBookMailJob" />
<!-- 시스템 로딩후 20초후 시작 -->
<property name="startDelay" value="20000" />
<!-- 1분마다 실행 -->
<property name="repeatInterval" value=60000" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no">
<property name="triggers">
<list>
<ref bean="arriveBookMailTrigger" />
<ref bean="testTrigger" />
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
<prop key="org.quartz.threadPool.threadCount">5</prop>
<prop key="org.quartz.threadPool.threadPriority">4</prop>
<prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
</props>
</property>
</bean>
3. 실행 객체(job) 생성
package com.sds.ist.glims.schedule.service;
import org.apache.log4j.Logger;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class ArriveBookMailManagerImpl extends QuartzJobBean {
static protected Logger logger = Logger.getLogger(ArriveBookMailManagerImpl.class);
@Override
protected void executeInternal(JobExecutionContext arg0)
throws JobExecutionException {
//주기적으로 실행된 로직을 개발
}
}
4. 로그(log4j.properties)
# 쿼츠 자체의 로그
log4j.logger.org.quartz=ERROR
# JOB의 로그
log4j.logger.com.sds.ist.glims.schedule.service.ArriveBookMailManagerImpl=INFO
* 주의1) 초기 lib 등록시 최신 lib가 아니면 초기화되지 않는다는 오류를 볼 수 있음.
기존의 lib가 오래된거면 quartz내의 lib로 교체(이전 버전존재시에도 오류가 남)
* 주의2) SchedulerFactoryBean의 초기화시 db 테이블이 없다고 나오는 경우에
autowire="no" 를 입력하면 문제가 없음
[Quartz 사용전 Cron형식 알아보기]
* Quartz 형식 :
[Seconds] [Minutes] [Hours] [Day-of-month] [Month] [Day-of-Week] [Year]
- Seconds : 0 ~ 59 , Minites : 0 ~ 59 , Hours : 0 ~ 23
- Day of Month : 0 ~ 31 , Month : 1 ~ 12
- Day of Week : 1(Sunday) ~ 7(Saturday)
- Year : YYYY형식 -> 특정일에 수행할때만 사용
* 예제
- 매일 오전 9시에 수행 : 0 0 9 * * ?
- 매월 10일 오전 9시에 수행 : 0 0 9 10 * ?
- 매주 일요일 오전 9시에 수행 : 0 0 9 ? * 1
- 매월 두번재 일요일 오전 9시에 수행 : 0 0 9 ? * 1#2
( [실행할 요일]#[n번째] )
- 매시간 10분간격으로 수행 : 0 10 * * * ? 'Spring' 카테고리의 다른 글
[Spring] 전자정부 framework (0) | 2012.02.17 |
---|---|
[Spring] 공부하자 스프링.. (0) | 2011.12.14 |
[Spring] AOP (Aspect Oriented Programming) (0) | 2011.10.25 |
[Spring] Wiki_Technical Report (0) | 2011.09.07 |
[Spring] Hello 찍기 (0) | 2011.04.13 |