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

接下來寫一個被排程的任務:
然後可以在web.xml配置spring的contextloaderlistener監聽器,用它來啟動spring的ioc容器:
最後是spring的配置檔案applicationcontext.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: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程序,相信不會對這種表達式感到陌生。