본문 바로가기

Dev/Spring

[Quartz] Spring 3.0 + Quartz 1.8.5 연동

현재까진 Quartz 2.0 이 나왔으나 

관련 포럼에서는 Quartz 2.0 이 Spring 3.0 에 문제를 발생시킨다 한다.

Quartz 1.8 은 문제없이 잘 돌아간다.



간단히 Quartz 는 Java Job Scheduler 라고 보면된다. 

Quartz 1.8.5 :  http://www.quartz-scheduler.org/download/download-catalog.html


다운받은 Quartz 를 압축해제후 Quartz-1.8.5.jar 파일을 해당 WAS Library 에 Import 한다


두가지 요소의 Class 를 생성할것이다.

첫번째론 작업이 실행될 Class(JobTask)
두번째는 위의 Class 를 스케쥴러를 통해 실행하게 끔 해주는 JobBean 을 만들 것이다. (JobScheduler)

우선 심플하게 JobTask Class 를 보면

 /**  JobTask.java**/

public class JobTask { public void test(){ System.out.println("Task 실행!"); } } 


그 다음 위의 클래스를 스케쥴러에 의해 실행되게 해주는 Class 를 만든다.



 /**  JobScheduler.java**/

import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; public class JobScheduler extends QuartzJobBean{ private JobTask jobTask; public void setJobTask(JobTask jobTask) { this.jobTask = jobTask; } @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { jobTask.test(); } }


이제 기본 Class 는 다만들었고 Container 에서 인식할 수있게 Servlet 에서 Bean 정의를 해준다.

 1. 위의 Class 들의 Bean 정의
 2. JobDetailBean 
 3. Quartz Trigger 정의
 4. SchedulerFactoryBean 에 설정한 Bean 주입

 
 
 우선 JobTask Bean을 정의한다.


<
bean id="JobTask" class="com.apro.service.JobTask"/>
 
  


다음은 Spring에서 Quartz 연동을 제공하는 JobDetailBean 을 정의한다.
기본 Property 는  위에서만든 JobTask 정보 와스케쥴러를 통해서 실행되게 할 JobScheduler 이다.


<bean name="JobProcess" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.apro.service.JobScheduler"/> <property name="jobDataAsMap"> <map> <entry key="JobTask" value-ref="JobTask"></entry> </map> </property> </bean>
 



다음은 Trigger
Quartz 에서 제공하는 Trigger 는 2가지이다

1. SimpleTrigger :  Job 시작시간, 종료시간, 실행간격 등 간단한 설정으로 정의
2. CronTrigger    : Unix Cron Expression 을 이용하여 SimpleTrigger 보다 더 정교하게 Job 시간을 정의 할 수있다.

CronTrigger 를 이용하여 매일 5초마다 JobTask 가 실행되게 Trigger 를 정의하면 아래와 같다.


<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="JobProcess"/> <property name="cronExpression" value="0/5 * * * * ?"/> </bean>
 

 

마지막으로 위의 JobDetailBean 과 TriggerBean 을 Spring 에서 제공하는 SchedulerFactoryBean 에 Injection 시킨다.
 

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="jobDetails"> <list> <ref bean="JobProcess"/> </list> </property> <property name="triggers"> <list> <ref bean="cronTrigger"/> </list> </property> </bean>
 



이제 Spring container 를 가동시켜보면.

아래와 같이 5초마다 JobTask 가 실행되는걸 확인 할 수 있다.