天天看點

Web項目中使用Spring 3.x + Quartz 2.x實作作業排程詳解

quartz是一個基于java的作業排程管理的輕量級架構,目前在很多企業應用中被使用,它的作用類似于java.util中的timer和timetask、資料庫中的job等,但quartz的功能更強大、更靈活。從quartz2開始,你可以使用pojo作為一個任務(job),這種開發方式進一步降低了代碼的耦合度,如果跟spring進行整合,使用起來将更加友善簡單。

整合開發需要使用的jar如下所示:

Web項目中使用Spring 3.x + Quartz 2.x實作作業排程詳解

接下來寫一個被排程的任務:

Web項目中使用Spring 3.x + Quartz 2.x實作作業排程詳解

然後可以在web.xml配置spring的contextloaderlistener監聽器,用它來啟動spring的ioc容器:

Web項目中使用Spring 3.x + Quartz 2.x實作作業排程詳解

最後是spring的配置檔案applicationcontext.xml:

Web項目中使用Spring 3.x + Quartz 2.x實作作業排程詳解

<?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:p="http://www.springframework.org/schema/p"  

    xsi:schemalocation="http://www.springframework.org/schema/beans   

            http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

    <!-- 配置排程器工廠(schedulerfactorybean) -->  

    <bean name="startquertz"  

        class="org.springframework.scheduling.quartz.schedulerfactorybean">  

        <property name="triggers">  

            <list>  

                <ref bean="myjobtrigger" />  

            </list>  

        </property>  

    </bean>  

    <!-- 配置cron觸發器(crontriggerfactorybean) -->  

    <bean id="myjobtrigger"  

        class="org.springframework.scheduling.quartz.crontriggerfactorybean">  

        <property name="jobdetail">  

            <ref bean="myjobdetail" />  

        <property name="cronexpression">  

            <!-- 每隔一秒鐘執行一次 -->  

            <value>0/1 * * * * ?</value>  

    <!-- 配置方法調用任務工廠(xxxjobdetailfactorybean) -->  

    <bean id="myjobdetail"  

        class="org.springframework.scheduling.quartz.methodinvokingjobdetailfactorybean">  

        <property name="targetobject">  

            <ref bean="myjob" />  

        <property name="targetmethod">  

            <value>dowork</value>  

    <!-- 配置自定義的時間任務(job) -->  

    <bean id="myjob" class="com.accp.job.myjob" />  

</beans>  

到此為止,一個最簡單的spring 3+ quartz 2就做好了,啟動你的伺服器看看控制台,時間任務就開始執行了!

關于crontriggerfactorybean中cron表達式(cronexpression)的配置,請看下面的說明。

cron 觸發器利用一系列特殊字元,如下所示:

反斜線(/)字元表示增量值。例如,在秒字段中“5/15”代表從第 5 秒開始,每 15 秒一次。

問号(?)字元和字母 l 字元隻有在月内日期和周内日期字段中可用。問号表示這個字段不包含具體值。是以,如果指定月内日期,可以在周内日期字段中插入“?”,表示周内日期值無關緊要。字母 l 字元是 last 的縮寫。放在月内日期字段中,表示安排在當月最後一天執行。在周内日期字段中,如果“l”單獨存在,就等于“7”,否則代表當月内周内日期的最後一個執行個體。是以“0l”表示安排在當月的最後一個星期日執行。

在月内日期字段中的字母(w)字元把執行安排在最靠近指定值的工作日。把“1w”放在月内日期字段中,表示把執行安排在當月的第一個工作日内。

井号(#)字元為給定月份指定具體的工作日執行個體。把“mon#2”放在周内日期字段中,表示把任務安排在當月的第二個星期一。

星号(*)字元是通配字元,表示該字段可以接受任何可能的值。

字段  允許值                   允許的特殊字元 

秒     0-59                        - * / 

分     0-59                        - * / 

小時  0-23                        - * / 

日期  1-31                        - * ? / l w c 

月份  1-12或者 jan-dec     - * / 

星期  1-7或者 sun-sat       - * ? / l c # 

年(o) 留白, 1970-2099       - * /

表達式意義 

"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觸發

如果你配置過linux系統上的cron程序,相信不會對這種表達式感到陌生。