Quartz架構提供了豐富的任務排程支援,比如,在
何時執行何種任務,它是一個開源的由OpenSymphony維護的項目,開發者能夠在Java EE,或單獨的Java
SE應用中使用它。無論是簡單的任務排程,還是複雜的企業級應用,Quartz都能夠很好地勝任。其中,這些任務可以是普通POJO,甚至還可以是EJB
3.0元件。
如果開發者需要開發如下方面的應用,則Quartz是理想的選擇。
◆驅動工作流:比如,如果新建立的流程任務需要在2小時内處理完,則在2小時後Quartz會檢查訂單是否成功處理。如果沒有處理,則Quartz會依據工作流定義的規則來對訂單進行處理,銷毀它,或者進行其他處理。
◆系統維護工作:比如,在每個工作日的固定時間将RDBMS中的内容導出為XML檔案。
Spring
2.0提供了org.springframework.scheduling.quartz包,以支援Quartz任務排程內建。為提供使用者的任務,開發
者實作的類必須繼承于quartz.QuartzJobBean抽象類。QuartzJobBean是Quartz中org.quartz.Job接口的
簡單實作(子類),Spring為簡化Job接口的實作而提供了QuartzJobBean類。QuartzJobBean同Java 2
SDK中的TimerTask類似,用于定義任務本身。其中,executeInternal()方法定義待執行的任務,這同TimerTask中的
run()類似。
為了指定更複雜的任務排程規則,開發者要使用Spring提供的CronTriggerBean,它是Quartz中
org.quartz.CronTrigger的子類,Spring
2.0為簡化CronTrigger子類的開發而提供了CronTriggerBean。CronTriggerBean比
SimpleTriggerBean功能更強大,它能夠控制任務執行的精确時間,比如,早上九點半需要執行某QuartzJobBean中給定的任務。借
助于CronTriggerBean中的cronExpression屬性能夠設定任務的執行時機。
Quartz是一個強大的企業級任務排程架構,Spring中繼承并簡化了Quartz,下面就看看在Spring中怎樣配置Quartz:首先我們來寫二個被排程的類QuartzJob,及QuartzJobTwo,二個以上類似:
package com.writchie.quartz;
public class QuartzJob
{
public void work()
{
System.out.println("Spring Quartz的任務排程1被調用!");
//定時調用的業務邏輯
}
}
package com.writchie.quartz;
public class QuartzJobTwo
{
public void work()
{
System.out.println("Spring Quartz的任務排程2被調用 !");
//定時調用的業務邏輯
}
}
Spring的配置檔案applicationContext.xml:
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
work
work
10,15,20,25,30,35,40,45,50,55 * * * * ?
0 15 13 ? * SUN-SAT
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
測試程式:
package com.writchie.quartz;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class QuartzService {
public static void main(String[] args) {
System.out.println("測試任務排程開始...");
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
// 如果配置檔案中将startQuertz bean的lazy-init設定為false 則不用執行個體化
// context.getBean("startQuertz");
System.out.print("測試任務排程結束!/n");
}
}
測試結果:
測試任務排程開始...
- Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
測試任務排程結束!
Spring Quartz的任務排程1被調用!
Spring Quartz的任務排程1被調用!
Spring Quartz的任務排程1被調用!
Spring Quartz的任務排程1被調用!