Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或爲運行十個,百個,甚至是好幾萬個Jobs這樣複雜的日程序表。Jobs可以做成標準的Java組件或 EJBs。
Quartz官方: http://www.opensymphony.com/quartz/
定時批處理作業是J2EE企業應用裏很重要的一環,用來在晚間進行財務掛賬,數據轉存,新聞聯播等等操作。 而在Spring裏,已經很好的集成了Quartz,簡單到像配cron一樣,在xml文件裏面配一下時間就可以自動執行,不需要寫一行代碼。Spring對Quartz大刀闊斧的簡化堪稱範例。
例子: 1、被調度的類
- package com.kay.quartz;
- public class QuartzJob
- {
- public void work()
- {
- System.out.println("Quartz的任務調度!!!");
- }
- }
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
- <beans>
- <!-- 要調用的工作類 -->
- <bean id="quartzJob" class="com.kay.quartz.QuartzJob"></bean>
- <!-- 定義調用對象和調用對象的方法 -->
- <bean id="jobtask"
- class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
- <!-- 調用的類 -->
- <property name="targetObject">
- <ref bean="quartzJob"/>
- </property>
- <!-- 調用類中的方法 -->
- <property name="targetMethod">
- <value>work</value>
- </property>
- </bean>
- <!-- 定義觸發時間 -->
- <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean">
- <property name="jobDetail">
- <ref bean="jobtask"/>
- </property>
- <!-- cron表達式 -->
- <property name="cronExpression">
- <value>10,15,20,25,30,35,40,45,50,55 * * * * ?</value>
- </property>
- </bean>
- <!-- 總管理類 如果將lazy-init='false'那麼容器啓動就會執行調度程序 -->
- <bean id="startQuertz" lazy-init="false" autowire="no"
- class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
- <property name="triggers">
- <list>
- <ref bean="doTime"/>
- </list>
- </property>
- </bean>
- </beans>
3、測試程序:
- package com.kay.quartz;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class MainTest
- {
- /**
- * @param args
- */
- public static void main(String[] args)
- {
- System.out.println("Test start.");
- ApplicationContext context = new ClassPathXmlApplicationContext("quartz-config.xml");
- //如果配置文件中將startQuertz bean的lazy-init設置爲false 則不用實例化
- //context.getBean("startQuertz");
- System.out.print("Test end..");
- }
- }
關於cron表達式:
Cron 表達式包括以下 7 個字段:
* 秒
* 分
* 小時
*
月內日期
* 月
* 周內日期
* 年(可選字段)
特殊字符
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 #
年(可選) 留空, 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觸發
每天早上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 *