[Spring] Spring - Quartz¸¦ »ç¿ëÇÏ¿© ½ºÄÉÁÙ·¯ ±¸ÇöÇϱâ
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]