Quartz 任務調度:初體驗
Quartz 是個開源的做業調度框架,爲在 Java 應用程序中進行做業調度提供了簡單卻強大的機制。Quartz框架包含了調度器監聽、做業和觸發器監聽。你能夠配置做業和觸發器監聽爲全局監聽或者是特定於做業和觸發器的監聽。Quartz 容許開發人員根據時間間隔(或天)來調度做業。它實現了做業和觸發器的多對多關係,還能把多個做業與不一樣的觸發器關聯。整合了 Quartz 的應用程序能夠重用來自不一樣事件的做業,還能夠爲一個事件組合多個做業。Quartz在功能上遠遠超越了JDK自帶的Timer,很好很強大!
相關網站:
下面是官方的一個入門例子,我作了部分改動,添加上了中文註釋,主要是瞭解Quartz 的工做方式和試用方法。
package org.quartz.examples.example1;
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
/**
* This Example will demonstrate how to start and shutdown the Quartz
* scheduler and how to schedule a job to run in Quartz.
*
* @author Bill Kratzer
*/
public
class SimpleExample {
public
void run()
throws Exception {
Log log = LogFactory.getLog(SimpleExample.
class);
log.info(
"------- 初始化開始 ----------------------");
// 首先建立一個調度程序工廠
SchedulerFactory schedulerFactory =
new StdSchedulerFactory();
// 從工廠獲取一個調度程序實例
Scheduler scheduler = schedulerFactory.getScheduler();
log.info(
"------- 初始化完成 -----------");
log.info(
"------- 調度任務 -------------------");
// 設置做業調度時間:某一時間後的下一秒
Date runTime = TriggerUtils.getEvenMinuteDate(
new Date());
// 定義一個具體做業job1,並加入group1組,而且綁定到具體的做業類HelloJob上
JobDetail jobDetail =
new JobDetail(
"job1",
"group1", HelloJob.
class);
// 建立一個簡單的觸發器
SimpleTrigger simpleTrigger =
new SimpleTrigger(
"trigger1",
"group1");
// 設置觸發時間
simpleTrigger.setStartTime(runTime);
// 設置重複執行週期
simpleTrigger.setRepeatInterval(2000);
// 設置重複執行次數
simpleTrigger.setRepeatCount(3);
// 設置調度的具體做業和相關的觸發器
scheduler.scheduleJob(jobDetail, simpleTrigger);
log.info(jobDetail.getFullName() +
" 將在某時刻: " + runTime +
" 運行!");
// 啓動調度程序
scheduler.start();
log.info(
"------- 已啓動調度程序 -----------------");
// wait long enough so that the scheduler as an opportunity to
// run the job!
log.info(
"------- 等待15秒... -------------");
try {
// 等待15秒顯示
Thread.sleep(15L * 1000L);
// 執行......
}
catch (Exception e) {
}
// 關閉調度程序
log.info(
"------- 關閉調度程序開始 ---------------------");
scheduler.shutdown(
true);
log.info(
"------- 關閉調度程序完成 -----------------");
}
public
static
void main(String[] args)
throws Exception {
SimpleExample example =
new SimpleExample();
example.run();
}
}
package org.quartz.examples.example1;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Date;
/**
* <p>
* This is just a simple job that says "Hello" to the world.
* 一個簡單的做業,來自Quartz的Simple Examples。
* </p>
*
* @author Bill Kratzer
*/
public
class HelloJob
implements Job {
private
static Log _log = LogFactory.getLog(HelloJob.
class);
/**
* <p>
* Empty constructor for job initilization
* </p>
* <p>
* Quartz requires a public empty constructor so that the
* scheduler can instantiate the class whenever it needs.
* </p>
*/
public HelloJob() {
}
/**
* <p>
* Called by the <code>{@link org.quartz.Scheduler}</code> when a
* <code>{@link org.quartz.Trigger}</code> fires that is associated with
* the <code>Job</code>.
* </p>
*
* @throws JobExecutionException if there is an exception while executing the job.
*/
public
void execute(JobExecutionContext context)
throws JobExecutionException {
// Say Hello to the World and display the date/time
_log.info(
"Hello World! - " +
new Date());
}
}
運行結果:
2008-08-21 00:01:06 - INFO org.quartz.examples.example1.SimpleExample - ------- 初始化開始 ----------------------
2008-08-21 00:01:07 - INFO org.quartz.simpl.SimpleThreadPool - Job execution threads will use class loader of thread: main
2008-08-21 00:01:07 - INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.1.6.0 created.
2008-08-21 00:01:07 - INFO org.quartz.simpl.RAMJobStore - RAMJobStore initialized.
2008-08-21 00:01:07 - INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
2008-08-21 00:01:07 - INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 1.6.0
2008-08-21 00:01:07 - INFO org.quartz.examples.example1.SimpleExample - ------- 初始化完成 -----------
2008-08-21 00:01:07 - INFO org.quartz.examples.example1.SimpleExample - ------- 調度任務 -------------------
2008-08-21 00:01:07 - INFO org.quartz.examples.example1.SimpleExample - group1.job1 將在某時刻: Thu Aug 21 00:02:00 CST 2008 運行!
2008-08-21 00:01:07 - INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
2008-08-21 00:01:07 - INFO org.quartz.examples.example1.SimpleExample - ------- 已啓動調度程序 -----------------
2008-08-21 00:01:07 - INFO org.quartz.examples.example1.SimpleExample - ------- 等待15秒... -------------
2008-08-21 00:01:09 - INFO org.quartz.examples.example1.SimpleExample - ------- 關閉調度程序開始 ---------------------
2008-08-21 00:01:09 - INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
2008-08-21 00:01:09 - INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
2008-08-21 00:01:09 - INFO org.quartz.simpl.SimpleThreadPool - There are still 13 worker threads active. See javadoc runInThread(Runnable) for a possible explanation
2008-08-21 00:01:09 - INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
2008-08-21 00:01:09 - INFO org.quartz.examples.example1.SimpleExample - ------- 關閉調度程序完成 -----------------
Process finished with exit code 0
注意:這個示例依賴jta.jar,還沒仔細研究爲何要依賴這個包,不過這個包就在Quartz的發佈包中,目前最新的releas版是1.60.