簡介
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 ThreadExecutor 2014-02-26 00:22:31,766 22 [main] INFO - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl 2014-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.0 2014-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 ThreadExecutor 2014-02-26 01:05:25,794 28 [main] INFO - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl 2014-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.0 2014-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.job1 execute job at Wed Feb 26 01:05:28 CST 2014 by trigger group1.job1 execute job at Wed Feb 26 01:05:31 CST 2014 by trigger group1.job1 execute job at Wed Feb 26 01:05:34 CST 2014 by trigger group1.job1 execute 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實例