Spring的Quartz使用說明

集成起來比較簡單,對線程無需任何理解,Spring手冊上也有清楚的說明。

只需寫一個POJO,其餘的都是配置,而且若使用CronTriggerBean,可以配置很複雜的任務調度。


1.編寫一個普通的JAVA類

package com.spring.quartz;

public class SpringQuartDemo {
	public void doHappy(){
		System.out.println("Happy! ");
	}
	public void doHello(){
		System.out.println("Hello!");
	}
}


2. 配置springQuartz.xml

springQuartz.xml

<?xml version="1.0" encoding="UTF-8"?>  
 <beans xmlns="http://www.springframework.org/schema/beans"  
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
          xmlns:tx="http://www.springframework.org/schema/tx"  
          xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-2.0.xsd  
          http://www.springframework.org/schema/tx 
          http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">  
  
        <bean id="springQuartDemo" class="com.spring.quartz.SpringQuartDemo"></bean>
    
        <bean id="obtainMetricMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
	    <property name="targetObject" ref="springQuartDemo" />
	    <property name="targetMethod" value="doHello" />
	    <!-- 併發執行 -->
	    <property name="concurrent" value="true" />
	</bean>
	<bean id="obtainMetricTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
	    <property name="jobDetail" ref="obtainMetricMethod"></property>
	    <property name="cronExpression" value="0 */1 * * * ?"></property>
	</bean>
	
        <!-- ======================== 調度工廠 ======================== -->
	<bean id="springJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	    <property name="startupDelay" value="10" />
	    <property name="triggers">
	        <list>
	            <ref bean="obtainMetricTrigger"/>
	        </list>  
	    </property>  
	</bean>
</beans>  


說明:

使用MethodInvokingJobDetailFactoryBean建立任務

targetObject 目標對象,即需要定時執行的POJO
targetMethod 目標方法,即需要定時執行的POJO方法
concurrent 默認情況下,Quartz Jobs是無狀態的,可能導致jobs之間互相的影響,如果你爲相同的JobDetail指定兩個Trigger,很可能當第一個job完成之前,第二個job就開始了。如果Jobdetail實現了Stateful接口,就不會發生這樣的事情。第二個job將不會在第一個job完成之前開始。爲了使得jobs不併發運行,設置concurrent標記爲false


使用CronTriggerBean建立規則,調度任務

jobDetail 任務詳情,即所需要調度的任務
cronExpression 調用規則,即什麼時候調用。詳細說明見附錄


使用SchedulerFactoryBean包裝任務

triggers 觸發器,調用哪些任務
autoStartup 是否自動啓動,該Bean被初始化後是否自動啓動定時任務
schedulerName 給這個計劃設定一個名稱。


3. 配置web.xml

web.xml文件中配置,加載springQuartz.xml

     <!-- 初始化 -->  
     <context-param>  
         <param-name>contextConfigLocation</param-name>  
         <!-- 如果有多個文件,在文件之間用英文逗號隔開 -->  
         <param-value>classpath:spring.xml;classpath:modules/**/spring*.xml</param-value>  
     </context-param>


4.附錄

Spring--quartz中cronExpression

 
字段 允許值 允許的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小時 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可選) 留空, 1970-2099 , - * /


通配符(*)可以用來表示某個子表達式域的每一個可能的值。因此,“*”號用在月份裏,表示每月。用在星期幾裏,表示一週中的每天。

每個 子表達式域都有一組有效的值,這些值都是顯然意見的。例:用0-59表示秒和分,用0到23表示小時。幾號用0-31中的任何值,但是要小心每月的天數。 月份指定的值應該是0至11,也可以用字符串 JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV和DEC表示。星期幾用1到7表示(1=星期天),或用英文字 符表示:SUN,MON,TUE,WED,THU,FRI和SAT。

字符“/”用來表示增量的值。例如:如果用“0/15”表示分,就表 示從一個小時的0分開始,在這小時內每隔15分鐘一次。如果用"3/20"表示分,則表示從一個小時的3分開始,在這小時內每隔20分鐘一次。也可以用 “3,23,43”表示。注意"*/35"並不是表示每35分鐘,而是表示從一個小時的0分開始,每隔35分鐘一次,相當於"0,35"。

“?"號允許用在幾號和星期幾的子字符串域中,用來說明沒有指定值。

“L” 字符允許用在幾號和星期幾域中,是"last"的縮寫。“L”用在幾號裏意思是這個月的最後一天,如果是1月就指31號,如果是閏年的2月就是28號。如 果用在星期幾裏,他就是表示“7”或者“SAT”(星期六)。但是如果L用在一個值的後面聯合表示星期幾域,就表示“這個月最後一個星期幾”。例 如:“6L”或“FRIL”表示這個月的最後一個星期五。同樣也可以用一個偏移變量表示距離某個月最後一天的天數。例如:“L-3”表示某月最後一天的倒 數第三天。但用“L“字符時,不要將“L”用在列表或範圍中,那樣你會混淆或者獲得不是預期的結果。

“W”用來指定某一號最近的工作日(星期一至五),例如:“15W”放在幾號裏,表示這個月15號最近的一個工作日。


“#”號用指定某月第幾個工作日,例如:“6#3”或“FRI#3”放在星期幾域中,表示這個月第三個星期五。


例子

表達式意義
"0 0 12 * * ?" 每天中午12點觸發
"0 15 10 ? * *" 每天上午10:15觸發
"0 15 10 * * ?" 每天上午10:15觸發
"0 15 10 * * ? *" 每天上午10:15觸發
"0 15 10 * * ? 2005" 2005年的每天上午10:15觸發
"0 * 14 * * ?" 在每天下午2點到下午2:59期間的每1分鐘觸發
"0 0/5 14 * * ?" 在每天下午2點到下午2:55期間的每5分鐘觸發
"0 0/5 14,18 * * ?" 在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發
"0 0-5 14 * * ?" 在每天下午2點到下午2:05期間的每1分鐘觸發
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44觸發
"0 15 10 ? * MON-FRI" 週一至週五的上午10:15觸發
"0 15 10 15 * ?" 每月15日上午10:15觸發
"0 15 10 L * ?" 每月最後一日的上午10:15觸發
"0 15 10 ? * 6L" 每月的最後一個星期五上午10:15觸發
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最後一個星期五上午10:15觸發
"0 15 10 ? * 6#3" 每月的第三個星期五上午10:15觸發

每天早上6點
0 6 * * *
每兩個小時
0 */2 * * *
晚上11點到早上8點之間每兩個小時,早上八點
0 23-7/2,8 * * *
每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點
0 11 4 * 1-3
1月1日早上4點
0 4 1 1 *

例如:"0 0 12 ? * WED"-表示每週三12:00:00pm"。

其中每個獨立的子表達式都可以用範圍或者列表表示。例如:

前例的”WED“也可以寫成:

"MON-FRI"(範圍表示)

"MON,WED,FRI"(列表表示)

"MON-WED,SAT"(範圍加列表)



下面是一些表達式的樣例,你可以從JavaDoc中找到更多的例子。

Cron Expressions示例

例1-一個表達式表示每5分鐘。

"0 0/5 * * * ?"

例2——表示每分鐘的10秒後,每5鍾一次(如:10:00:10 am,10:05:10 am,等等)

"10 0/5 * * * ?"

例3——表示運行在每個星期三,星期五的10:30,11:30,12:30 and 13:30

"0 30 10-13 ? * WED,FRI"

例4——表示每月的5號和20號的早8點至早10點每30分鐘一次。

"0 0/30 8-10 5,20 * ?"

注意,有些計劃調度需求如果用一個觸發器會很複雜,例如:“早9:00至10:00每5分鐘,下午1:00至10:00每20分鐘”,這種情況下可以是單的創建兩個觸發器同時運行一個JOB


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章