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

+ Recent posts