SPRING
2017.05.22 / 18:54

[Spring] Spring - Quartz¸¦ »ç¿ëÇÏ¿© ½ºÄÉÁÙ·¯ ±¸ÇöÇϱâ

ducati
Ãßõ ¼ö 227

Scheduling ¼­ºñ½º

°³¿ä

Scheduling ¼­ºñ½º´Â ¾îÇø®ÄÉÀÌ¼Ç ¼­¹ö ³»¿¡¼­ ÁÖ±âÀûÀ¸·Î ¹ß»ýÇϰųª ¹Ýº¹ÀûÀ¸·Î ¹ß»ýÇÏ´Â ÀÛ¾÷À» Áö¿øÇÏ´Â ±â´ÉÀ¸·Î¼­ À¯´Ð½ºÀÇ Å©·Ð(Cron) ¸í·É¾î¿Í À¯»çÇÑ ±â´ÉÀ» Á¦°øÇÑ´Ù.
½ÇÇàȯ°æ Scheduling ¼­ºñ½º´Â ¿ÀǼҽº ¼ÒÇÁÆ®¿þ¾î·Î Quartz ½ºÄÉÁì·¯¸¦ »ç¿ëÇÑ´Ù. º» Àå¿¡¼­´Â Quartz ½ºÄÉÁì·¯ÀÇ ±âº» °³³äÀ» »ìÆ캻 ÈÄ, IoC ¼­ºñ½º¸¦ Á¦°øÇÏ´Â Spring°ú Quartz ½ºÄÉÁì·¯¸¦ ÅëÇÕÇÏ¿© »ç¿ëÇÏ´Â ¹æ¹ýÀ» »ìÆ캻´Ù.

¼³¸í

Quartz ½ºÄÉÁì·¯

Quartz ½ºÄÉÁì·¯ ½ÇÇà°ú °ü°èµÈ ÁÖ¿ä ¿ä¼Ò´Â Scheduler, Job, JobDetail, Trigger °¡ ÀÖ´Ù.

  • Scheduler ´Â Quartz ½ÇÇà ȯ°æÀ» °ü¸®ÇÏ´Â ÇÙ½É °³Ã¼ÀÌ´Ù.
  • Job Àº »ç¿ëÀÚ°¡ ¼öÇàÇÒ ÀÛ¾÷À» Á¤ÀÇÇÏ´Â ÀÎÅÍÆäÀ̽º·Î¼­ Trigger °³Ã¼¸¦ ÀÌ¿ëÇÏ¿© ½ºÄÉÁìÇÒ ¼ö ÀÖ´Ù.
  • JobDetail ´Â ÀÛ¾÷¸í°ú ÀÛ¾÷±×·ì°ú °°Àº ¼öÇàÇÒ Job¿¡ ´ëÇÑ »ó¼¼ Á¤º¸¸¦ Á¤ÀÇÇÏ´Â °³Ã¼ÀÌ´Ù.
  • Trigger ´Â Á¤ÀÇÇÑ Job °³Ã¼ÀÇ ½ÇÇà ½ºÄÉÁìÀ» Á¤ÀÇÇÏ´Â °³Ã¼·Î¼­ Scheduler °³Ã¼¿¡°Ô Job ¼öÇà½ÃÁ¡À» ¾Ë·ÁÁÖ´Â °³Ã¼ÀÌ´Ù.

Quartz ½ºÄÉÁì·¯´Â ¼öÇà ÀÛ¾÷À» Á¤ÀÇÇÏ´Â Job°ú ½ÇÇà ½ºÄÉÁìÀ» Á¤ÀÇÇÏ´Â Trigger¸¦ ºÐ¸®ÇÔÀ¸·Î½á À¯¿¬¼ºÀ» Á¦°øÇÑ´Ù. Job °ú ½ÇÇà ½ºÄÉÁìÀ» Á¤ÀÇÇÑ °æ¿ì, JobÀº ±×´ë·Î µÎ°í ½ÇÇà ½ºÄÉÁ츸À» º¯°æÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ÇϳªÀÇ Job¿¡ ¿©·¯ °³ÀÇ ½ÇÇà ½ºÄÉÁìÀ» Á¤ÀÇÇÒ ¼ö ÀÖ´Ù.

Quartz ½ºÄÉÁì·¯ »ç¿ë ¿¹Á¦

Quartz ½ºÄÉÁì·¯ÀÇ ÀÌÇظ¦ µ½±â À§ÇØ °£´ÜÇÑ ¿¹Á¦¸¦ »ìÆ캻´Ù. ´ÙÀ½ ¿¹´Â Quartz ¸Å´º¾ó¿¡¼­ ÂüÁ¶ÇÑ °ÍÀ¸·Î Quartz¸¦ »ç¿ëÇÏ´Â ¹æ¹ý°ú »ç¿ëÀÚ JobÀ» ¼³Á¤ÇÏ´Â ¹æ¹ýÀ» º¸¿©ÁØ´Ù.

»ç¿ëÀÚ Á¤ÀÇ Job

»ç¿ëÀÚ´Â Job °³Ã¼¸¦ »ý¼ºÇϱâ À§ÇØ org.quartz.Job ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ°í ½É°¢ÇÑ ¿À·ù°¡ ¹ß»ýÇÑ °æ¿ì JobExecutionException ¿¹¿Ü¸¦ ´øÁú ¼ö ÀÖ´Ù. Job ÀÎÅÍÆäÀ̽º´Â ´ÜÀÏ ¸Þ¼Òµå·Î execute()À» Á¤ÀÇÇÑ´Ù.

 public class DumbJob implements Job {
    public void execute(JobExecutionContext context)
      throws JobExecutionException
    {
      System.out.println("DumbJob is executing.");
    }
  }
  • DumbJobÀº Job ÀÎÅÍÆäÀ̽ºÀÇ execute() ¸Þ¼Òµå¸¦ ±¸ÇöÇÑ´Ù.
  • execute() ¸Þ¼Òµå´Â ´Ü¼øÈ÷ JobÀÌ ¼öÇàµÊÀ» Ç¥½ÃÇÏ´Â ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù.
Quartz »ç¿ë ÄÚµå
  JobDetail jobDetail = 
            new JobDetail("myJob",// Job ¸í
              sched.DEFAULT_GROUP,  // Job ±×·ì¸í('null' °ªÀÎ °æ¿ì DEFAULT_GROUP À¸·Î Á¤ÀǵÊ)
              DumbJob.class);       // ½ÇÇàÇÒ Job Ŭ·¡½º
 
  Trigger trigger = TriggerUtils.makeDailyTrigger(8, 30);  // ¸ÅÀÏ 08½Ã 30ºÐ ½ÇÇà
  trigger.setStartTime(new Date()); // Áï½Ã ½ÃÀÛ
  trigger.setName("myTrigger");
 
  sched.scheduleJob(jobDetail, trigger);
  • ¿ì¼± Job ¼³Á¤À» À§ÇØ JobDetail Ŭ·¡½º¸¦ Á¤ÀÇÇÑ´Ù.
  • TriggerUtilsÀ» ÀÌ¿ëÇÏ¿© ¸ÅÀÏ 8½Ã30ºÐ ½ÇÇàÇÏ´Â Trigger¸¦ »ý¼ºÇÑ´Ù.
  • ¸¶Áö¸·À¸·Î, Scheduler¿¡ JobDetail°ú Trigger¸¦ µî·ÏÇÑ´Ù.

Spring °ú Quartz ÅëÇÕ

SpringÀº Scheduling Áö¿øÀ» À§ÇÑ ÅëÇÕ Å¬·¡½º¸¦ Á¦°øÇÑ´Ù. Spring 2.5 ´Â JDK 1.3 ¹öÀüºÎÅÍ Æ÷ÇÔµÈ Timer ¿Í ¿ÀǼҽº ¼ÒÇÁÆ®¿þ¾îÀÎ Quartz ½ºÄÉÁì·¯¸¦ Áö¿øÇÑ´Ù. ¿©±â¼­´Â Quartz ½ºÄÉÁì·¯¿Í SpringÀ» ÅëÇÕÇÏ¿© »ç¿ëÇÏ´Â ¹æ¹ýÀ» »ìÆ캻´Ù. 
Quartz ½ºÄÉÁì·¯¿ÍÀÇ ÅëÇÕÀ» À§ÇØ SpringÀº Spring ÄÁÅؽºÆ® ³»¿¡¼­ Quart Scheduler¿Í JobDetail, Trigger ¸¦ ºóÀ¸·Î ¼³Á¤ÇÒ ¼ö ÀÖµµ·Ï Áö¿øÇÑ´Ù. ´ÙÀ½Àº ¿¹Á¦¸¦ Áß½ÉÀ¸·Î Quartz ÀÛ¾÷ »ý¼º°ú ÀÛ¾÷ ½ºÄÉÁ층, ÀÛ¾÷ ½ÃÀÛ ¹æ¹ýÀ» »ìÆ캻´Ù.

ÀÛ¾÷ »ý¼º

SpringÀº ÀÛ¾÷ »ý¼ºÀ» À§ÇÑ ¹æ¹ýÀ¸·Î ´ÙÀ½ µÎ °¡Áö ¹æ½ÄÀ» Á¦°øÇÑ´Ù.

  • JobDetailBeanÀ» ÀÌ¿ëÇÑ ¹æ¹ýÀ¸·Î, QuartzJobBeanÀ» »ó¼Ó¹Þ¾Æ Job Ŭ·¡½º¸¦ »ý¼ºÇÏ´Â ¹æ¹ý
  • MethodInvokingJobDetailFactoryBeanÀ» ÀÌ¿ëÇÏ¿© Bean °´Ã¼ÀÇ ¸Þ¼Òµå¸¦ Á÷Á¢ È£ÃâÇÏ´Â ¹æ¹ý
JobDetailBeanÀ» ÀÌ¿ëÇÑ ÀÛ¾÷ »ý¼º

JobDetail´Â ÀÛ¾÷ ½ÇÇà¿¡ ÇÊ¿äÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Â °´Ã¼ÀÌ´Ù. SpringÀº JobDetail ºó »ý¼ºÀ» À§ÇØ JobDetailBeanÀ» Á¦°øÇÑ´Ù. ¿¹¸¦ µé¸é ´ÙÀ½°ú °°´Ù.

JobDetailBean ¼Ò½º ÄÚµå

package egovframework.rte.fdl.scheduling.sample;
 
public class SayHelloJob extends QuartzJobBean {
 
	private String name;
 
	public void setName (String name) {
		this.name = name;	
	}
 
	@Override
	protected void executeInternal (JobExecutionContext ctx) throws JobExecutionException {
		System.out.println("Hello, " + name);
	}
}
  • SayHelloJob Ŭ·¡½º´Â ÀÛ¾÷ »ý¼ºÀ» À§ÇØ QuartzJobBeanÀÇ executeInternal(..) ÇÔ¼ö¸¦ ¿À¹ö¶óÀ̵åÇÑ´Ù.

JobDetailBean ¼³Á¤

 <bean id="jobDetailBean"
	class="org.springframework.scheduling.quartz.JobDetailBean">
	<property name="jobClass" value="egovframework.rte.fdl.scheduling.sample.SayHelloJob" />
	<property name="jobDataAsMap">
		<map>
			<entry key="name" value="JobDetail"/>
		</map>
	</property>
  </bean>
  • jobDataAsMap °³Ã¼¸¦ ÀÌ¿ëÇÏ¿© JobDetail °³Ã¼¿¡ Job ¼³Á¤¿¡ ÇÊ¿äÇÑ ¼Ó¼º Á¤º¸¸¦ Àü´ÞÇÑ´Ù.
MethodInvokingJobDetailFactoryBeanÀ» ÀÌ¿ëÇÑ ÀÛ¾÷ »ý¼º

¼Ò½º ÄÚµå

package egovframework.rte.fdl.scheduling.sample;
 
public class SayHelloService {
 
	private String name;
 
	public void setName (String name) {
		this.name = name;	
	}
 
	public void sayHello () {
		System.out.println("Hello, " + this.name);
	}
}
  • ÀÛ¾÷ ¼öÇàÀ» ÇÒ Bean Ŭ·¡½º¸¦ Á¤ÀÇÇÑ´Ù.

¼³Á¤

<bean id="sayHelloService" class="egovframework.rte.fdl.scheduling.sample.SayHelloService">
	<property name="name" value="FactoryBean"/>
</bean>
 
<bean id="jobDetailFactoryBean"
	class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	<property name="targetObject" ref="sayHelloService" />
	<property name="targetMethod" value="sayHello" />
	<property name="concurrent" value="false" />
</bean>
  • Á¤ÀÇÇÑ Bean °´Ã¼ÀÇ ¸Þ¼Òµå¸¦ Á÷Á¢ È£ÃâÇÏ´Â ÀÛ¾÷À» »ý¼ºÇϱâ À§ÇØ MethodInvokingJobDetailFactoryBeanÀ» Á¤ÀÇÇÑ´Ù.

ÀÛ¾÷ ½ºÄÉÁ층

Spring¿¡¼­ ÁÖ·Î »ç¿ëµÇ´Â TriggerŸÀÔÀº SimpleTriggerBean°ú CronTriggerBean ÀÌ ÀÖ´Ù. SimpleTrigger ´Â ƯÁ¤ ½Ã°£, ¹Ýº¹ ȸ¼ö, ´ë±â ½Ã°£°ú °°Àº ´Ü¼ø ½ºÄÉÁ층¿¡ »ç¿ëµÈ´Ù. CronTrigger ´Â À¯´Ð½ºÀÇ Cron ¸í·É¾î¿Í À¯»çÇϸç, º¹ÀâÇÑ ½ºÄÉÁ층¿¡ »ç¿ëµÈ´Ù. CronTrigger ´Â ´Þ·ÂÀ» ÀÌ¿ëÇϵí ƯÁ¤ ½Ã°£, ¿äÀÏ, ¿ù¿¡ Job À» ¼öÇàÇϵµ·Ï ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº SimpleTriggerBean°ú CronTriggerBeanÀ» ÀÌ¿ëÇÏ¿© ¾Õ¼­ »ý¼ºÇÑ ÀÛ¾÷À» ½ºÄÉÁ층ÇÏ´Â ¹æ¹ýÀ» »ìÆ캻´Ù.

SimpleTriggerBeanÀ» ÀÌ¿ëÇÑ ¼³Á¤

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
	<property name="jobDetail" ref="jobDetailBean" />
        <!-- Áï½Ã ½ÃÀÛ -->
	<property name="startDelay" value="0" />
   	<!-- ¸Å 10Ãʸ¶´Ù ½ÇÇà -->
	<property name="repeatInterval" value="10000" />
</bean>
  • ¾Õ¼­ JobDetailBean À» ÀÌ¿ëÇÏ¿© »ý¼ºÇÑ ÀÛ¾÷À» ½ºÄÉÁ층À» À§ÇÑ Trigger ¿¡ µî·ÏÇÑ´Ù. SimpleTriggerBeanÀº Áï½Ã ½ÃÀÛÇÏ°í ¸Å 10Ãʸ¶´Ù ½ÇÇàÇϵµ·Ï ¼³Á¤ÇÏ¿´´Ù.

CronTriggerBeanÀ» ÀÌ¿ëÇÑ ¼³Á¤

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
   	<property name="jobDetail" ref="jobDetailFactoryBean" />
   	<!-- ¸Å 10Ãʸ¶´Ù ½ÇÇà -->
   	<property name="cronExpression" value="*/10 * * * * ?" />
</bean>
  • ¾Õ¼­ MethodInvokingJobDetailFactoryBean À» ÀÌ¿ëÇÏ¿© »ý¼ºÇÑ ÀÛ¾÷À» ½ºÄÉÁ층À» À§ÇÑ Trigger ¿¡ µî·ÏÇÑ´Ù. CronTriggerBeanÀº ¸Å 10Ãʸ¶´Ù ½ÇÇàÇϵµ·Ï ¼³Á¤ÇÏ¿´´Ù. Å©·Ð Ç¥Çö½Ä¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀºQuartz Cron Ç¥Çö½Ä¸¦ ÂüÁ¶ÇÑ´Ù.

ÀÛ¾÷ ½ÃÀÛÇϱâ

½ºÄÉÁ층ÇÑ ÀÛ¾÷ÀÇ ½ÃÀÛÀ» À§ÇØ Spring Àº SchedulerFactoryBeanÀ» Á¦°øÇÑ´Ù.

¼³Á¤

<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	<property name="triggers">
		<list>
			<ref bean="simpleTrigger" />
			<ref bean="cronTrigger" />
		</list>
	</property>
</bean>
  • SchedulerFactoryBean À» ÀÌ¿ëÇÏ¿© SimpleTriggerBean °ú CronTriggerBean ±â¹ÝÀÇ °¢ Trigger ÀÛ¾÷À» ½ÃÀÛÇÑ´Ù.

Âü°íÀÚ·á



¸µÅ© : http://javastore.tistory.com/96 

¸µÅ© : http://kamsi76.egloos.com/470846 

¸µÅ© : http://briansjavablog.blogspot.kr/2012/09/spring-quartz-tutorial.html 



Ãâó: http://devx.tistory.com/entry/Spring-Spring-Quartz¸¦-»ç¿ëÇÏ¿©-½ºÄÉÁÙ·¯-±¸ÇöÇϱâ [Meta Developer Story]