Spring 3.0 에서 제공하는 TaskExecutor와 TaskScheduler도 있지만 Quartz를 사용하는 경우도 있다.

필수 dependency
               
                <!-- Quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>1.8.5</version>
</dependency> 

가장 큰 설정은 trigger와 listener

1. Trigger

org.springframework.scheduling.quartz.CronTriggerBean
org.springframework.scheduling.quartz.SimpleTriggerBean

2종류가 있는데 cronjob스럽게 돌리려면 CronTrigger를 그렇지 않고 인터벌 및 간단한 설정으로
스케쥴러를 구동시키려면 SimpleTrigger를 사용하는 것이 좋다.
 
<bean id="testTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="testJob"/>
<property name="cronExpression" value="0/1 * * * * ?"/>
</bean>

 다음과 같이 등록하고

<bean id="testJob" class="org.springframework.scheduling.quartz.JobDetailBean"
     p:jobClass="com.test.testDaemon">
<property name="jobDataAsMap">
 <map>
   <entry key="test1Service">
    <ref bean="test1Service"/>
   </entry>
   <entry key="test2Service">
    <ref bean="test2Service"/>
   </entry>
 </map>
</property>
</bean> 

다음과 같이 설정하면 된다. testDaemon 에서 쓰이는 bean들은 map형태로 프로퍼티를 등록하면 된다. (setter구현 必)


  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<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">3</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>


SchedulerFactoryBean에 다음과 같이 tiggers를 등록한다. quartzProperties에는 thread의 갯수 등의 각종 설정변수 들이 있다.

 
2. Listener 
Quartz에서 제공하는 TriggerListener를 구현하면 각  fire->execute-> complete 혹은 misfire되는 시점에 로깅을 남길 수 있다. 다음은 Anyframe 사이트에 있는 TriggerListener 구현체 중 하나이다.

 public class GlobalTriggerListener implements TriggerListener {
    Log logger = LogFactory.getLog(GlobalTriggerListener.class);
    String listenerType = "Non global";

    public void setListenerType(String listenerType) {
        this.listenerType = listenerType;
    }

    public void triggerFired(Trigger trigger, JobExecutionContext ctx) {
        logger.info("Scheduled " + trigger.getJobName() + " Fired!!");
    }

    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext ctx) {
        logger.info("Scheduled " + trigger.getJobName() + " Executed!!");
        return false;
    }

    public void triggerComplete(Trigger trigger, JobExecutionContext ctx, int arg) {
        logger.info("Scheduled " + trigger.getJobName() + " Completed!!");
    }

    public void triggerMisfired(Trigger trigger) {
        logger.error("Scheduled " + trigger.getJobName() + " Misfired!!");
    }

    public String getName() {
        return "GlobalTriggerListener";
    }
}

SchedulerFactoryBean 설정에서 다음과 같이 Listener를 등록할 수 있다.

  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggerListeners" ref="triggerListener"/> <property name="globalTriggerListeners" ref="globalTriggerListener"/>
<property name="quartzProperties">
<props>
    <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
     <prop key="org.quartz.threadPool.threadCount">3</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> 
신고

'09.Framework' 카테고리의 다른 글

Spring Framework / ReloadableResourceBundleMessageSource  (0) 2011.08.16
Spring MVC SimpleMappingExceptionResolver  (0) 2011.08.16
Spring 3.0 에서 Quartz 설정  (0) 2011.08.09
iBatis 동적 SQL 작성  (0) 2009.10.25
WebWork in Action  (0) 2009.10.07
Hibernate VS iBatis  (0) 2009.09.23
Posted by Stewie


티스토리 툴바