一、什麼是Quartz
1、quartz是一個作業調度系統(a job scheduling system),不但可以集成到其他軟件系統中,而且還可以獨立運行。
2、Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或爲運行十個,百個,甚至是好幾萬個Jobs這樣複雜的日程序表。Jobs可以做成標準的Java組件或 EJBs。
3、Quartz是一個任務日程管理系統,一個在預先確定(被納入日程)的時間到達時,負責執行(或者通知)其他軟件組件的系統。藉助於cron表達式,他可以執行各種複雜的任務調度。雖然JDK爲簡單任務調度提供了Timer支持,但對於更復雜的調度,如:在某個特定的時刻調度任務,Timer就力不從心了。
4、Quartz用一個小Java庫發佈文件(.jar文件),這個庫文件包含了所有Quartz核心功能。這些功能的主要接口(API)是Scheduler接口。它提供了簡單的操作,例如:將任務納入日程或者從日程中取消,開始/停止/暫停日程進度。
二、下載和安裝Quartz
1、Quartz的下載:http://www.quartz-scheduler.org/ (只有註冊用戶才能下載)
下載完成,將得到quartz-2.1.6.tar.gz,解壓後得到的目錄結構是:
doc : API 和 各種數據庫的建表sql (納尼?! 還和數據庫有關係.)(⊙_⊙?) Quartz應用到集羣,和持久化作業的時候會用到,先不討論,咱入門先!
examples : 官方給寫的例子了,也就是我們本次學習的重點
lib : Quartz 所依賴的jar , 相信你的工程中已經添加了吧 ,主要是 log c3p0 什麼的,自己看看吧
quartz : 源碼
…………
quartz-all-2.1.6.jar : 打好的 jar 包,將其放入工程的classpath路徑下即可
三、javaSE中使用Quartz步驟
1、將quartz-all-2.1.6.jar或者quartz-2.1.6.jar添加到classpath路徑下。
(實際上Quartz還是用SLF4J作爲日誌工具,因此還需要將slf4j-api-2.1.6.jar導入到類路徑下)
2、配置quartz運行環境的基本屬性文件:quartz.properties (放在類路徑下即可)
# 配置主調度器屬性
org.quartz.scheduler.instanceName=QuartzScheduler
org.quartz.scheduler.instanceId=AUTO
# 配置線程池
# Quartz線程池的實現類
org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
# 線程池的線程數量
org.quartz.threadPool.threadCount=1
# 線程池裏線程的優先級
org.quartz.threadPool.threadPriority=10
# 配置作業存儲
org.quartz.jobStore.misfireThreshold=60000
org.quartz.jobStore.class=org.quartz.simpl.RAMJobStore
如果我們不配置此文件的話,默認使用quartz-2.1.6.jar中的quartz.properties文件(在該壓縮文件的org/quartz路徑下),如果需要改變其運行屬性,我們可以自己創建一個quartz.properties文件,並將該文件放在系統加載的類路徑下,ClassLoader就會自動加載並啓用其中的各種屬性。
3、創建quartz作業類
該類須實現org.quartz.Jog接口,該接口只有一個execute()方法,當quartz調度改作業運行時,execute()方法就會執行。
package lee;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.*;
public class TestJob
implements Job
{
//判斷作業是否執行的旗標
private boolean isRunning = false;
public void execute(JobExecutionContext context)
throws JobExecutionException
{
//如果作業沒有被調度
if (!isRunning)
{
System.out.println(new Date() + " 作業被調度。");
//循環100次來模擬任務的執行
for (int i = 0; i < 100 ; i++)
{
System.out.println("作業完成" + (i + 1) + "%");
try
{
Thread.sleep(100);
}
catch (InterruptedException ex)
{
ex.printStackTrace();
}
}
System.out.println(new Date() + " 作業調度結束。");
}
//如果作業正在運行,即使獲得調度,也立即退出
else
{
System.out.println(new Date() + "任務退出");
}
}
}
3、創建quartz觸發器
觸發器用來指定任務被調度的時機。該框架提供了一系列的觸發器,但最常用的的是:SimpleTrigger和CronTrigger。
SimpleTrigger:主要用於簡單的調度。如在給定的時間內重複執行作業或者間隔固定的時間執行作業。類似於JDK提供的Timer。
CronTrigger:用於執行更復雜的調度。該調度器基於Calendar—Like和Unix Corn的表達式。
如: //創建trigger,創建一個簡單的調度器
//指定該任務被重複調度50次,每次間隔2秒
Trigger trigger = new SimpleTrigger("dd" ,
Scheduler.DEFAULT_GROUP, 50, 20000) ;
4、創建quartz調度器
調度器用於將任務和觸發器管理起來,任務和觸發器是多對多的關係:當一個任務關聯多個觸發器時,每個觸發器被激發時,這個任務都會被調度一次;當一個觸發器控制多個任務時,此觸發器被觸發時,所有關聯到給觸發器的任務都將被調度。
quartz調度器由Schedule接口體現。該接口聲明如下方法:
a:void addJob(JobDetail d,boolean replace):將jobDetail實例添加到調度器。
b:Date scheduleJob(JobDetail d,Trigger t):使用Trigger來控制JobDetail實例。
c:Date scheduleJob(Trigger t):添加觸發器t來調度作業。
package lee;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.JobDetail;
import org.quartz.SchedulerException;
import org.quartz.SimpleTrigger;
public class MyQuartzServer
{
public static void main(String[] args)
{
MyQuartzServer server = new MyQuartzServer();
try
{
server.startScheduler();
}
catch (SchedulerException ex)
{
ex.printStackTrace();
}
}
//執行調度
private void startScheduler() throws SchedulerException
{
//使用工廠創建調度器實例
Scheduler scheduler = StdSchedulerFactory
.getDefaultScheduler();
//以作業創建JobDetail實例
JobDetail jobDetail = new JobDetail("dd",
Scheduler.DEFAULT_GROUP , TestJob.class);
//創建trigger,創建一個簡單的調度器
//指定該任務被重複調度50次,每次間隔2秒
Trigger trigger = new SimpleTrigger("dd" ,
Scheduler.DEFAULT_GROUP, 50, 20000) ;
//調度器將作業與trigger關聯起來
scheduler.scheduleJob(jobDetail, trigger );
//開始調度
scheduler.start();
}
}