天天看點

Spring任務排程實戰之Quartz Cron Trigger

在Quartz中除了使用最簡單的Simple Trigger以外,也可以使用類似Linux上Cron作業的CronTrigger的方式來運作Job,下面是一個小例子:

1. 首先是一個任務類,這個類沒有實作任何接口,其中包含一個run方法用來運作這個task,代碼如下:

[java] 

view plain copy print ?

  1. package org.garbagecan.springstudy.schedule.quartz;  
  2. public class MyTask {  
  3.     private String name;  
  4.     public void run() {  
  5.         System.out.println("Run task: " + name + ".");  
  6.     }  
  7.     public String getName() {  
  8.         return name;  
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11. }  

2. 一個Job類,這個類需要繼承spring的QuartzJobBean類,來說明目前類是一個Quartz的Job類,類包含了一個Task類的對象執行個體,在每次Job被排程的時候,将會運作其中的executeInternal方法,代碼如下:

  1. import org.quartz.JobExecutionContext;  
  2. import org.quartz.JobExecutionException;  
  3. import org.springframework.scheduling.quartz.QuartzJobBean;  
  4. public class MyJob extends QuartzJobBean {  
  5.     private MyTask myTask;  
  6.     protected void executeInternal(JobExecutionContext context)  
  7.             throws JobExecutionException {  
  8.         myTask.run();  
  9.     public MyTask getMyTask() {  
  10.         return myTask;  
  11.     public void setMyTask(MyTask myTask) {  
  12.         this.myTask = myTask;  

3. Spring配置檔案,内容如下

[html] 

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"  
  5.        default-lazy-init="true">  
  6.     <bean id="timerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">  
  7.         <property name="triggers">  
  8.             <list>  
  9.                 <ref local=""cronTrigger""/>  
  10.             </list>  
  11.         </property>  
  12.     </bean>  
  13.     <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">  
  14.         <property name="jobDetail" ref="myJob"/>  
  15.         <property name="cronExpression" value="0/10 * * * * ?"></property>  
  16.     <bean id="myJob" class="org.springframework.scheduling.quartz.JobDetailBean">  
  17.         <property name="name" value="myJob"/>  
  18.         <property name="group" value="myGroup"/>  
  19.         <property name="description" value="myJob"/>  
  20.         <property name="jobClass" value="org.garbagecan.springstudy.schedule.quartz.MyJob"/>  
  21.         <property name="jobDataAsMap">  
  22.             <map>  
  23.                 <entry key="myTask" value-ref="myTask" />  
  24.             </map>  
  25.     <bean id="myTask" class="org.garbagecan.springstudy.schedule.quartz.MyTask">  
  26.         <property name="name" value="my task"/>  
  27. </beans>  

3.1 首先,需要定義了一個Task類,具體的任務邏輯可以寫在這個類裡;

3.2 定義一個JobDetailBean類的bean,這個是為了适應Quartz的JobDetail,其中可以定義name,group,description等資訊,這些資訊主要是為了和别的作業做區分使用;其中還有一個jobClass屬性,定義了使用的是那個Job類執行個體,這裡使用第二步建立的MyJob類;最後定義了一個叫jobDataAsMap的屬性,這個屬性是Quartz提供的用來傳遞參數使用的一個Map集合,這些集合裡的類會被spring自動注入到目标Job類中;

3.3 建立一個觸發器類,這裡使用的是Quartz提供的Cron Trigger,在Spring裡,使用的是CronTriggerBean來做映射,主要是定義cron表達式,具體可以參考quartz的官方文檔,這裡定義的是每隔10秒運作一次;當然還有最主要的具體的Job類執行個體;

3.4 最後定義了一個SchedulerFactoryBean的bean,其中定義了具體要排程那些觸發器;

4. 最後,寫一個測試類來測試上面的代碼和配置

  1. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  2. public class Test {  
  3.     public static void main(String[] args) throws Exception {  
  4.         new ClassPathXmlApplicationContext("/org/garbagecan/springstudy/schedule/quartz/spring.xml");  

運作Test類,可以看到一個叫my task的job會啟動,并且每隔10秒運作一次。