簡介
Quartz 是個開源的作業調度架構,為在 Java 應用程式中進行作業調度提供了簡單卻強大的機制。Quartz 允許開發人員根據時間間隔(或天)來調度作業。它實現了作業和觸發器的多對多關係,還能把多個作業與不同的觸發器關聯。整合了 Quartz 的應用程式可以重用來自不同事件的作業,還可以為一個事件組合多個作業。雖然可以通過屬性檔案(在屬性檔案中可以指定 JDBC 事務的資料來源、全域作業和/或觸發器接聽程式、外掛程式、線程池,以及更多)配置 Quartz,但它根本沒有與應用程式伺服器的上下文或引用整合在一起。結果就是作業不能訪問 Web 服務器的內建函式;例如,在使用 WebSphere 應用伺服器時,由 Quartz 調度的作業並不能影響伺服器的動態緩衝和資料來源。 使用前奏
1. 建立一個maven項目(可以是web也可以是普通的java項目),添加上相關依賴。
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <quartz.version>2.2.0</quartz.version></properties><dependencies>....<!--quartz dependency--> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>${quartz.version}</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>${quartz.version}</version> </dependency></dependencies>
2. 在resources下建立一個設定檔quartz.properties,添加如下內容:
org.quartz.scheduler.instanceName = MyScheduler #指定調度器的名稱org.quartz.threadPool.threadCount = 3 #線程池中最多同時有3個線程運行org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore #指定Quartz的資料(job及trigger資訊)儲存位置,RamJobStore指記憶體
啟動一個Scheduler
package com.netease.test.quartz;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.impl.StdSchedulerFactory;/** * User: hzwangxx * Date: 14-2-26 * Time: 0:16 */public class QuartzTest { public static void main(String[] args) { try { //1.從StdSchedulerFactory工廠中擷取一個任務調度器 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); //2. 啟動調度器 scheduler.start(); System.out.println("scheduler is start..."); //關閉調度器 scheduler.shutdown(); } catch (SchedulerException e) { e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates. } }}/* console output:2014-02-26 00:22:31,744 0 [main] INFO - Using default implementation for ThreadExecutor2014-02-26 00:22:31,766 22 [main] INFO - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl2014-02-26 00:22:31,767 23 [main] INFO - Quartz Scheduler v.2.2.0 created.2014-02-26 00:22:31,768 24 [main] INFO - RAMJobStore initialized.2014-02-26 00:22:31,769 25 [main] INFO - Scheduler meta-data: Quartz Scheduler (v2.2.0) 'MyScheduler' with instanceId 'NON_CLUSTERED' Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads. Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.2014-02-26 00:22:31,769 25 [main] INFO - Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'2014-02-26 00:22:31,769 25 [main] INFO - Quartz scheduler version: 2.2.02014-02-26 00:22:31,769 25 [main] INFO - Scheduler MyScheduler_$_NON_CLUSTERED started.scheduler is start...2014-02-26 00:22:31,769 25 [main] INFO - Scheduler MyScheduler_$_NON_CLUSTERED shutting down.2014-02-26 00:22:31,770 26 [main] INFO - Scheduler MyScheduler_$_NON_CLUSTERED paused.2014-02-26 00:22:31,770 26 [main] INFO - Scheduler MyScheduler_$_NON_CLUSTERED shutdown complete.*/ 簡單Helloworld
package com.netease.test.quartz;import org.quartz.*;import org.quartz.impl.StdSchedulerFactory;import java.util.Date;import static org.quartz.JobBuilder.newJob;import static org.quartz.SimpleScheduleBuilder.simpleSchedule;import static org.quartz.TriggerBuilder.newTrigger;/** * User: hzwangxx * Date: 14-2-26 * Time: 0:16 */public class QuartzTest { public static void main(String[] args) { try { //1.從StdSchedulerFactory工廠中擷取一個任務調度器 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); //2. 啟動調度器 scheduler.start(); System.out.println("scheduler is start..."); //3. 添加定時任務 // 3.1 定義job JobDetail job = newJob(HelloJob.class) .withIdentity("job1", "group1") .build(); // 3.2 定義Trigger,使得job現在就運行,並每隔3s中運行一次,重複運行5次, withRepeatCount(number)設定job運行次數為number+1 Trigger trigger = newTrigger() .withIdentity("trigger1", "group1") .startNow() .withSchedule(simpleSchedule() .withIntervalInSeconds(3) .withRepeatCount(4)) .build(); // 3.3 交給scheduler去調度 scheduler.scheduleJob(job, trigger); //4. 關閉調度器 //scheduler.shutdown(); } catch (SchedulerException e) { e.printStackTrace(); } } /** * 自訂Job,實現Job介面並實現execute方法 */ public static class HelloJob implements Job{ public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("execute job at " + new Date() + " by trigger " + context.getTrigger().getJobKey()); } }}/* console output:2014-02-26 01:05:25,766 0 [main] INFO - Using default implementation for ThreadExecutor2014-02-26 01:05:25,794 28 [main] INFO - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl2014-02-26 01:05:25,795 29 [main] INFO - Quartz Scheduler v.2.2.0 created.2014-02-26 01:05:25,797 31 [main] INFO - RAMJobStore initialized.2014-02-26 01:05:25,798 32 [main] INFO - Scheduler meta-data: Quartz Scheduler (v2.2.0) 'MyScheduler' with instanceId 'NON_CLUSTERED' Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally. NOT STARTED. Currently in standby mode. Number of jobs executed: 0 Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 3 threads. Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.2014-02-26 01:05:25,798 32 [main] INFO - Quartz scheduler 'MyScheduler' initialized from default resource file in Quartz package: 'quartz.properties'2014-02-26 01:05:25,799 33 [main] INFO - Quartz scheduler version: 2.2.02014-02-26 01:05:25,799 33 [main] INFO - Scheduler MyScheduler_$_NON_CLUSTERED started.scheduler is start...execute job at Wed Feb 26 01:05:25 CST 2014 by trigger group1.job1execute job at Wed Feb 26 01:05:28 CST 2014 by trigger group1.job1execute job at Wed Feb 26 01:05:31 CST 2014 by trigger group1.job1execute job at Wed Feb 26 01:05:34 CST 2014 by trigger group1.job1execute job at Wed Feb 26 01:05:37 CST 2014 by trigger group1.job1*/ API說明
Quartz架構核心的幾個類如下: Scheduler - 與scheduler進行互動的主要API,整個生命週期是由SchedulerFactory建立到調用shutdown()方法 Job - 希望scheduler進行調度的自訂任務介面,主要實現該介面的execute方法。 JobDetail - 定義Job的相關資訊 Trigger - 定義調度器調度任務的觸發器,主要描述任務的執行時間,周期等資訊 JobBuilder - 用來定義和建立JobDetail執行個體 TriggerBuilder - 用來定義和建立Trigger執行個體