วันพุธที่ 9 พฤศจิกายน พ.ศ. 2554

ทำ Cron บน Web Application ง่ายๆ ด้วย Spring + Quartz

Share it Please
บน Linux เวลาต้องการที่จะรันโปรแกรม หรือ Script โดยตั้งเวลาให้รัน ทุกๆ เช้าหรือทุกๆ ชั่วโมงคงทำได้ไม่ยากเพราะบน Linux มี Cron อยู่ แต่ถ้าต้องการ Schedule รันโปรแกรมบน Windows คงต้องใช้ Windows Task Scheduler แต่ถ้าต้องการรัน Cron บน Web Application ล่ะจะต้องทำยังไง?
สำหรับ Java นั้นมี Library สำหรับจัดการ Schedule อยู่ชื่อว่า Quartz เอาไว้จัดการ Schedule ต่างๆ ใน Application ได้
แต่เนื่องด้วยถ้าใช้ Quartz อย่างเดียวมันคงไม่หล่อเท่าไร ดังนั้นเราจึงต้องเอามา Integrate กับ Spring ซะเพราะหลายคนส่วนใหญ่ก็ใช้งาน Spring กันอยู่แล้ว
ก่อนอื่นเรามาดู dependency กันก่อนครับว่าจะใช้ Quartz กับ Spring นั้นต้องใช้อะไรบ้าง

pom.xml

<dependencies>

 <dependency>
          <groupid>opensymphony</groupid>
   <artifactid>quartz</artifactid>
   <version>1.6.3</version>
 </dependency>
 
 <dependency>
   <groupid>commons-collections</groupid>
   <artifactid>commons-collections</artifactid>
   <version>3.2.1</version>
 </dependency>
 
 <dependency>
  <groupid>org.springframework</groupid>
  <artifactid>spring</artifactid>
  <version>3.0.5.RELEASE</version>
 </dependency>
 
 <dependency>
  <groupid>org.springframework</groupid>
  <artifactid>spring-web</artifactid>
  <version>3.0.5.RELEASE</version>
 </dependency>
 
  </dependencies>

จากนั้นให้สร้างไฟล์ที่เราต้องการจะรันเป็น Schedule


HelloQuartz.java

public class HelloQuartz {
    public void hello() {
        System.out.println("hello quartz");
    }
}
เมื่อมีองค์ประกอบครบแล้ว เราก็มา config applicationContext.xml กัน applicationContext.xml

<bean id="helloQuartz" class="com.example.scheduler.HelloQuartz" />
 
 <bean id="helloJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <property name="targetObject" ref="helloQuartz" />
  <property name="targetMethod" value="hello" />
 </bean>
 
 <bean id="helloJob" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail" ref="helloJobDetail" />
  <property name="cronExpression" value="0/5 * * * * ?" />
 </bean>
 
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
   <list>
    <ref bean="helloJob" />
   </list>
  </property>
 </bean>
จาก code ด้านบน เรากำหนดให้ bean ที่ต้องการรันเป็น HelloQuartz และกำหนด method ที่จะรันให้เป็น hello แล้วสั่งรันทุกๆ 5 วินาที ซึ่งเราสามารถกำหนด expression ได้ตาม pattern ของ Cron ครับ

Blogroll

About