Java Web應用中的任務調度 2

我們可以從web應用中的任何類訪問SchedulerPlugIn的唯一實例,並調度一些要執行的工作。首先需要一個Trigger(觸發器)對象來告訴任務何時運行、每隔多久運行一次。Quartz支持多種觸發器,在這個例子中我們使用CronTrigger
Trigger trigger = new CronTrigger("trigger1", "group1");
trigger.setCronExpression("0 0 15 ? * WED");

以上的觸發器會在每週三的下午3點執行指定任務。現在我們只要創建一個JobDetail對象,並把它和上面的觸發器一起傳遞給SchedulerPlugInscheduleWork()方法。
JobDetail jobDetail =
new JobDetail("Hello World Job",
"Hello World Group",
HelloWorld.class,
true, true, true);
//Schedule The work
//
調度這項任務
SchedulerPlugIn.scheduleWork(scheduledJobDetail, trigger);

實際工作在何處?

至此我們已決定Trigger,可以開始調度工作了。看上去一切都已完成,但實際上我們只是調度了一項任務,還有最重要的一步有待完成。注意HelloWorld.class作爲參數傳遞給了JobDetail的構造函數。這個類就是實際完成工作的地方。HelloWorld繼承了QuartzJob類,並覆蓋了execute()方法。當任務管理器決定運行這個任務時,execute()方法將被調用。來看代碼:
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;

//extend the proper Quartz class
//
繼承適當的Quartz
public class HelloWorld extends Job {

//override the execute method
//
覆蓋execute方法
public void execute(JobExecutionContext context) {

// Every job has it's own job detail
//
每個Job都有獨立的JobDetail
JobDetail jobDetail = context.getJobDetail();
// The name is defined in the job definition
//name
Job定義中指定
String jobName = jobDetail.getName();
//Every job has a Job Data map for storing extra information
//
每個Job都有一個Job Data map來存放額外的信息
JobDataMap dataMap = jobDetail.getJobDataMap();

System.out.println("Hello World!!!");
}
}

出於測試的目的,你可能希望將觸發器的頻率調的高一點,以便觀察到HelloWorld的動作。畢竟,你不想一直等到凌晨2點才能確定調度的任務確實運行了。相反,你可能需要一個每隔10秒運行的觸發器:
Trigger trigger = new SimpleTrigger("trigger1", "group1");
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
trigger.setRepeatInterval(10000L); // milliseconds
毫秒

注意,這個觸發器沒有使用類cron的語法。Quartz有大量各類的選項和配置方法,可適用於任何任務調度的需要。

其它計時方式的配置

Quartz
提供了多種調度任務的方式。CronTrigger可能是最複雜的一種,不過還有其它的選擇。大多數觸發器可以由Quartz提供的TriggerUtils類創建。以下是一些常見的觸發器的例子。如諺語所言,條條大路通羅馬!
每天凌晨2:22觸發的觸發器
//
方法一:使用makeDailyTrigger
Trigger trigger = TriggerUtils.makeDailyTrigger(2, 22);
trigger.setName("trigger1");
trigger.setGroup("group1");

//
方法二:使用CronTrigger
Trigger trigger = new CronTrigger("trigger1", "group1");
trigger.setCronExpression("0 22 2 * * ?");

5秒執行一次的觸發器
/* *
*
方法一:makeSecondlyTrigger
*
注意以下代碼將創建一個立即啓動的觸發器。要控制啓動時間,使用
* trigger.setStartTime(Date)
方法。
*/
Trigger trigger = TriggerUtils.makeSecondlyTrigger(5);
trigger.setName("MyFiveSecondTrigger");
trigger.setGroup("MyTriggerGroup");

/*
*
*
方法二:設置SimpleTrigger的重複次數和間隔時間。
*
注意以下代碼將創建一個立即啓動的觸發器。要控制啓動時間,使用
* trigger.setStartTime(Date)
方法。
*/
Trigger trigger = new SimpleTrigger("trigger1", "group1");
trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
trigger.setRepeatInterval(5000L); // milliseconds

按間隔時間運行任務
Trigger trigger = new SimpleTrigger("trigger1", "group1");
// 24 hours * 60(minutes per hour) *
// 60(seconds per minute) * 1000(milliseconds per second)
// 24
小時 * 60(分鐘每小時) * 60(秒每分鐘)* 1000(毫秒每秒鐘)
trigger.setRepeatInterval(24L * 60L * 60L * 1000L);

結論
在這個演示中,我們只接觸了Quartz框架的一些初級功能。記住,Java 5 J2EE 5也有自己的任務調度機制,但是它們不像Quartz那樣靈活易用。Quartz是目前唯一的開源Java任務調度框架,它的確爲開發者的錦囊中增加了很有用的內容。你可從Open Symphony下載Quartz,並得到一份很好的教程和使用說明。下載文檔
http://wenku.it168.com/d_000068380.shtml

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章