Java Web應用中的任務調度

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

Trigger trigger = new CronTrigger("trigger1", "group1");

trigger.setCronExpression("0 0 15 ? * WED");


以上的觸發器會在每週三的下午3點執行指定任務。現在我們只要創建一個JobDetail對象,並把它和上面的觸發器一起傳遞給SchedulerPlugIn的scheduleWork()方法。

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繼承了Quartz的Job類,並覆蓋了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,並得到一份很好的教程和使用說明。


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