定義一個任務是很簡單的實現TimerTask的run方法就可以了.
如下:SayHelloTask.java?

?1package?test.timerTask;
?2
?3import?java.util.TimerTask;
?4
?5public?class Task?extends?TimerTask?{
?6
?7??@Override
?8??public?void?run()?{
?9????//?TODO?Auto-generated?method?stub
10????System.out.println("測試TimerTask?:?Hello?!!");
11??}

12
13}



?1package?test.springTimer;
?2
?3import?java.util.TimerTask;
?4
?5public?class?Task2?extends?TimerTask{
?6????public?void?run(){
?7????????
?8????????System.out.println("task2?is?running");
?9????}

10
11????
12}

13


然后是配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "

<beans>
<bean id="sayHelloTask" class="test.springTimer.Task"></bean>
<bean id="HelloTask" class="test.springTimer.Task2"></bean>

<bean id="scheduledTask" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask">
<ref bean="sayHelloTask"/>
</property>
<!-- 任務執行周期 2m 關于一些任務的參數請參考JDK doc文檔和Spring相關文檔-->
<property name="period">
<value>2000</value>
</property>
<!-- 延時1m 執行任務 -->
<property name="delay">
<value>1000</value>
</property>
</bean>


<bean id="scheduledTask2" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask">
<ref bean="HelloTask"/>
</property>
<!-- 任務執行周期 2m 關于一些任務的參數請參考JDK doc文檔和Spring相關文檔-->
<property name="period">
<value>2000</value>
</property>
<!-- 延時1m 執行任務 -->
<property name="delay">
<value>1000</value>
</property>
</bean>


<!-- 啟動定時器 -->
<bean id="timerBean" class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledTask"/>
<ref bean="scheduledTask2"/>
</list>
</property>
</bean>
</beans>



測試類如下:TestApp.java


package?test.timerTask;

import?org.springframework.context.ApplicationContext;
import?org.springframework.context.support.ClassPathXmlApplicationContext;

public?class?TestApp?{

??
/**
???*?
@param?args
???
*/

??
public?static?void?main(String[]?args)?{
????
//?TODO?Auto-generated?method?stub
????ApplicationContext?context?=?new?ClassPathXmlApplicationContext("test/timerTask/javaTimer.xml");
?
//???ApplicationContext?context2?=?new?ClassPathXmlApplicationContext("test/timerTask/quartzTimer.xml");
??}

//?只要加載配置文件就可以了,
}
?


運行結果:
task2 is running
task2 is running
haha,task is running
haha,task is running
task2 is running

使用Java中的定時器比較簡單,其提供的任務也比較簡單, 下面來看看使用quartz來執行一個復雜的任務.


?1package?test.timerTask;
?2
?3import?org.quartz.JobExecutionContext;
?4import?org.quartz.JobExecutionException;
?5import?org.springframework.scheduling.quartz.QuartzJobBean;
?6
?7public?class?SayHelloTaskUsingQuartz?extends?QuartzJobBean?{
?8
?9??@Override
10??protected?void?executeInternal(JobExecutionContext?context)
11??????throws?JobExecutionException?{
12????//?TODO?Auto-generated?method?stub
13????System.out.println("使用Quartz?認為調度:?Hello!!");
14??}

15
16}
?
17



<?xml version="1.0" encoding="UTF-8"?>
??? <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "

<bean?id="sayHelloJob"?class="org.springframework.scheduling.quartz.JobDetailBean">
<property?name="jobClass">
<value>test.timerTask.SayHelloTaskUsingQuartz</value>
</property>
</bean>?

<!--?關鍵在如下兩個觸發器的配置?-->?

<!--?類似于Java的簡單觸發器?-->?

<bean?id="helloTrigger"?class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property?name="jobDetail">
<ref?bean="sayHelloJob"/>
</property>
<property?name="startDelay">
<value>1000</value>
</property>
<property?name="repeatInterval">
<value>3000</value>
</property>
</bean>?
????
<!--?復雜觸發器?-->?

<bean?id="helloCronTrigger"?class="org.springframework.scheduling.quartz.CronTriggerBean">
<property?name="jobDetail">
<ref?bean="sayHelloJob"/>
</property>
<property?name="cronExpression">?
??
<!--?關鍵在配置此表達式?-->?

<value>0?49?15?*?*??</value>
</property>
</bean>
<bean?id="scheduler"?class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property?name="triggers">
<ref?bean="helloCronTrigger"/>
</property>
</bean>

?? </beans
>

?

關于簡單觸發器和復雜觸發器,查考下面的解釋:


Quartz設計者做了一個設計選擇來從調度分離開作業。Quartz中的觸發器用來告訴調度程序作業什么時候觸發。框架提供了一把觸發器類型,但兩個最常用的是SimpleTrigger和CronTrigger。SimpleTrigger為需要簡單打火調度而設計。典型地,如果你需要在給定的時間和重復次數或者兩次打火之間等待的秒數打火一個作業,那么SimpleTrigger適合你。另一方面,如果你有許多復雜的作業調度,那么或許需要CronTrigger。

CronTrigger是基于Calendar-like調度的。當你需要在除星期六和星期天外的每天上午10點半執行作業時,那么應該使用CronTrigger。正如它的名字所暗示的那樣,CronTrigger是基于Unix克隆表達式的。

作為一個例子,下面的Quartz克隆表達式將在星期一到星期五的每天上午10點15分執行一個作業。
0 15 10 ? * MON-FRI

下面的表達式
0 15 10 ? * 6L 2002-2005
將在2002年到2005年的每個月的最后一個星期五上午10點15分執行作業。

你不可能用SimpleTrigger來做這些事情。你可以用兩者之中的任何一個,但哪個跟合適則取決于你的調度需要。
更多詳細介紹參考
此處:

關于cronExpression的介紹:
 
字段?允許值?允許的特殊字符
? 0-59? , - * /
? 0-59? , - * /
小時? 0-23? , - * /
日期? 1-31? , - * ? / L W C
月份? 1-12?或者 JAN-DEC? , - * /
星期? 1-7?或者 SUN-SAT? , - * ? / L C #
年(可選)? 留空, 1970-2099? , - * /
 ?
如上面的表達式所示:

“*”字符被用來指定所有的值。如:”*“在分鐘的字段域里表示“每分鐘”。

“-”字符被用來指定一個范圍。如:“10-12”在小時域意味著“10點、11點、12點”。
?
“,”字符被用來指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”.

“?”字符只在日期域和星期域中使用。它被用來指定“非明確的值”。當你需要通過在這兩個域中的一個來指定一些東西的時候,它是有用的。看下面的例子你就會明白。


“L”字符指定在月或者星期中的某天(最后一天)。即“Last ”的縮寫。但是在星期和月中“L”表示不同的意思,如:在月子段中“L”指月份的最后一天-1月31日,2月28日,如果在星期字段中則簡單的表示為“7”或者“SAT”。如果在星期字段中在某個value值得后面,則表示“某月的最后一個星期value”,如“6L”表示某月的最后一個星期五。

“W”字符只能用在月份字段中,該字段指定了離指定日期最近的那個星期日。

“#”字符只能用在星期字段,該字段指定了第幾個星期value在某月中


表達式

?意義
"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 *




定時批處理作業是J2EE企業應用里很重要的一環,用來在晚間進行財務掛賬,數據轉存,新聞聯播等等操作。

??? 而在Spring里,已經很好的集成了Quartz,簡單到像配cron一樣,在xml文件里面配一下時間就可以自動執行,不需要寫一行代碼。Spring對Quartz大刀闊斧的簡化堪稱范例,Quartz項目組也許可以學習一下。

??? <bean id="methodInvokingJobDetail"
??????? class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
??????? <property name="targetObject"><ref bean="financeDAO"/></property>
??????? <property name="targetMethod"><value>confirmOrder</value></property>
??? </bean>

??? <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
??????? <property name="jobDetail">
??????????? <ref bean="methodInvokingJobDetail"/>
??????? </property>
??????? <property name="cronExpression">
??????????? <value>0 0 6,12,20 * * ?</value>
??????? </property>
??? </bean>
??? <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
??????? <property name="triggers">
??????????? <list><ref local="cronTrigger"/></list>
??????? </property>
??? </bean>

上面這段配置文件規定了在早上6點和晚上8點執行financeDAO對象的confirmOrder()方法.