(1)什麼是Quartz?
(2)Quartz的特色;
(3)Quartz專用詞彙說明;
(4)Quartz任務調度基本實現原理;java
接下來看下具體的內容:數據庫
(1)什麼是Quartz?框架
Quartz是一個徹底由Java編寫的開源做業調度框架,爲在Java應用程序中進行做業調度提供了簡單卻強大的機制。Quartz容許開發人員根據時間間隔來調度做業。它實現了做業和觸發器的多對多的關係,還能把多個做業與不一樣的觸發器關聯。簡單地建立一個org.quarz.Job接口的Java類。less
(2)Quartz的特色;maven
做爲一個優秀的開源調度框架,Quartz 具備如下特色:分佈式
① 強大的調度功能,例如支持豐富多樣的調度方法,能夠知足各類常規及特殊需求;測試
② 靈活的應用方式,例如支持任務和調度的多種組合方式,支持調度數據的多種存儲方式;ui
③ 分佈式和集羣能力,Terracotta 收購後在原來功能基礎上做了進一步提高。編碼
④ Quartz 很容易與 Spring 集成實現靈活可配置的調度功能。xml
(3)Quartz專用詞彙說明;
下面是本文中用到的一些專用詞彙,在此聲明:
scheduler:
任務調度器
trigger:
觸發器,用於定義任務調度時間規則
job:
任務,即被調度的任務
misfire:
錯過的,指原本應該被執行但實際沒有被執行的任務調度
(4)Quartz任務調度基本實現原理;
Quartz 任務調度的核心元素是 scheduler, trigger 和 job,其中 trigger 和 job 是任務調度的元數據,scheduler 是實際執行調度的控制器。
在 Quartz 中,trigger 是用於定義調度時間的元素,即按照什麼時間規則去執行任務。Quartz 中主要提供了四種類型的 trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和 NthIncludedDayTrigger。這四種 trigger 能夠知足企業應用中的絕大部分需求。
在 Quartz 中,job 用於表示被調度的任務。主要有兩種類型的 job:無狀態的(stateless)和有狀態的(stateful)。對於同一個 trigger 來講,有狀態的 job 不能被並行執行,只有上一次觸發的任務被執行完以後,才能觸發下一次執行。Job 主要有兩種屬性:volatility 和 durability,其中 volatility 表示任務是否被持久化到數據庫存儲,而 durability 表示在沒有 trigger 關聯的時候任務是否被保留。二者都是在值爲 true 的時候任務被持久化或保留。一個 job 能夠被多個 trigger 關聯,可是一個 trigger 只能關聯一個 job。
在 Quartz 中, scheduler 由 scheduler 工廠建立:DirectSchedulerFactory 或者 StdSchedulerFactory。 第二種工廠 StdSchedulerFactory 使用較多,由於 DirectSchedulerFactory 使用起來不夠方便,須要做許多詳細的手工編碼設置。 Scheduler 主要有三種:RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。本文以最經常使用的 StdScheduler 爲例講解。這也是筆者在項目中所使用的 scheduler 類。
這一篇文章,咱們緊接着上一篇的文章,講講在Quartz在java project的項目中如何進行使用,在這裏咱們使用maven進行構建項目。先看下本章的大綱:
接下里一塊兒看下具體的內容:
(1)新建工程quartz-java;
新建一個java project取名爲quartz-java。
(2)配置pom.xml文件;
在pom.xml文件中添加quartz的依賴:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
(3)編碼說明;
(一)首先咱們須要定義一個任務類,好比爲HelloJob ,該類須要繼承Job類,而後添加execute(JobExecutionContext context)方法,在這個方法中就是咱們具體的任務執行的地方。
(二)在哪裏定義「在何時執行什麼任務呢?」:那麼咱們須要Scheduler,此類的建立方式使用Quartz提供的工廠類StdSchedulerFactory.getDefaultScheduler()進行建立。
(三)如何觸發呢:scheduler.scheduleJob(jobDetail,trigger);進行觸發定時任務,在這裏須要兩個參數。jobDetail能夠經過JobBuilder.newJob進行建立,在這裏就須要制定一個Job類了,也就是咱們第一步建立的HelloJob;trigger類的話,能夠經過TriggerBuilder.newTrigger進行建立。
(4)編寫Job類;
編寫HelloJob任務類:
package com.kfit.job;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 任務類.
* @author Angel --守護天使
* @version v.0.1
* @date 2017年4月21日
*/
public class HelloJob implements Job{
public void execute(JobExecutionContext context) throws JobExecutionException {
// 執行響應的任務.
System.out.println("HelloJob.execute,"+new Date());
}
}
(5)編寫啓動類進行代碼測試;
在Main方法中進行編碼測試:
package com.kfit;
import java.util.concurrent.TimeUnit;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import com.kfit.job.HelloJob;
/**
* 直接在Main方法中進行啓動測試.
* @author Angel --守護天使
* @version v.0.1
* @date 2017年4月21日
*/
public class App {
public static void main(String[] args) throws SchedulerException, InterruptedException {
/*
*在 Quartz 中, scheduler 由 scheduler 工廠建立:DirectSchedulerFactory 或者StdSchedulerFactory。第二種工廠 StdSchedulerFactory 使用較多,
*由於 DirectSchedulerFactory 使用起來不夠方便,須要做許多詳細的手工編碼設置。
*/
// 獲取Scheduler實例
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
System.out.println("scheduler.start");
//具體任務.
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job1","group1").build();
//觸發時間點. (每5秒執行1次.)
SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever();
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1").startNow().withSchedule(simpleScheduleBuilder).build();
// 交由Scheduler安排觸發
scheduler.scheduleJob(jobDetail,trigger);
//睡眠20秒.
TimeUnit.SECONDS.sleep(20);
scheduler.shutdown();//關閉定時任務調度器.
System.out.println("scheduler.shutdown");
}
}
執行代碼查看控制檯的打印信息:
-----------------------------------------------------------
scheduler.start
HelloJob.execute,Fri Apr 21 19:50:01 CST 2017
HelloJob.execute,Fri Apr 21 19:50:06 CST 2017
HelloJob.execute,Fri Apr 21 19:50:11 CST 2017
HelloJob.execute,Fri Apr 21 19:50:16 CST 2017
HelloJob.execute,Fri Apr 21 19:50:21 CST 2017
scheduler.shutdown