Quartz入門(一)
下載與安裝
下載jar包,將lib包放入classpath中
概述
Quartz對任務(wù)調(diào)度的領(lǐng)域問題進(jìn)行了高度的抽象,提出了調(diào)度器、任務(wù)和觸發(fā)器這3個核心的概念,并在org.quartz通過接口和類對重要的這些核心概念進(jìn)行描述
- 調(diào)度器:調(diào)度器用于將與作業(yè)觸發(fā)器關(guān)聯(lián),一個作業(yè)可關(guān)聯(lián)多個觸發(fā)器,這樣每個觸發(fā)器被可以觸發(fā)的作業(yè)執(zhí)行;一個觸發(fā)器可用于控制多個作業(yè),觸發(fā)觸發(fā)時,
全部作業(yè)將獲得調(diào)度。Quartz的調(diào)度器由Scheduler接口體現(xiàn). - 作業(yè):只需實(shí)現(xiàn)org.quartz.job接口即可。Job接口包含一個方法
execute(),execute()方法體是被調(diào)度的作業(yè)體。一旦實(shí)現(xiàn)Job接口和execute()方法,
Quartz確定作業(yè)運(yùn)作的時候,它將調(diào)用execute()方法體。 - 觸發(fā)器:有SimpleTrigger和CronTrigger兩種類型

一個簡單的例子
新建一個叫MyJob的類,實(shí)現(xiàn)Job接口
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Calendar;
/**
* Created by mi on 2017/5/2.
*/
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("任務(wù)正在執(zhí)行,執(zhí)行時間: " + Calendar.getInstance().getTime());
}
}
新建一個叫QuartzTest的類
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
/**
* Created by CiCi on 2017/5/2.
*/
public class QuartzTest {
public static void main(String[] args) throws Throwable {
SchedulerFactory factory = new StdSchedulerFactory();
// 從工廠里面拿到一個scheduler實(shí)例
Scheduler scheduler = factory.getScheduler();
// 計算任務(wù)的開始時間,DateBuilder.evenMinuteDate方法是取下一個整數(shù)分鐘
Date runTime = DateBuilder.evenMinuteDate(new Date());
// 真正執(zhí)行的任務(wù)并不是Job接口的實(shí)例,而是用反射的方式實(shí)例化的一個JobDetail實(shí)例
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
// 定義一個觸發(fā)器,startAt方法定義了任務(wù)應(yīng)當(dāng)開始的時間
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
// 將任務(wù)和Trigger放入scheduler
scheduler.scheduleJob(job, trigger);
scheduler.start();
try {
// 等待65秒,保證下一個整數(shù)分鐘出現(xiàn),這里注意,如果主線程停止,任務(wù)是不會執(zhí)行的
Thread.sleep(65L * 1000L);
} catch (Exception e) {
}
// scheduler結(jié)束
scheduler.shutdown(true);
}
}
通過代碼可以看到幾個重要的類:
JobDetail:真正的任務(wù)內(nèi)容,任務(wù)本身是繼承Job接口的,但是真正的任務(wù)是JobBuilder通過反射的方式實(shí)例化的
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job","group1").build()Trigger:觸發(fā)器,定義任務(wù)應(yīng)當(dāng)開始的時間,主要分為兩類SimpleTrigger,CronTrigger。當(dāng)前例子是簡單觸發(fā)器,CronTrigger主要用于處理quartz表達(dá)式定義的任務(wù),比如每個月20號,每個星期一之類的。
// 定義一個觸發(fā)器,startAt方法定義了任務(wù)應(yīng)當(dāng)開始的時間 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();Scheduler:調(diào)度器,現(xiàn)在我們有了要做的內(nèi)容,有了做任務(wù)的時間,接下來,就把這兩個內(nèi)容填充到計劃任務(wù)Scheduler對象里面,到了時間它就可以自動運(yùn)行啦。
scheduler.scheduleJob(job, trigger); scheduler.start();
注意事項(xiàng)
Quartz一般是通過日志打印的方式來執(zhí)行任務(wù)的,所以一定要有日志配置。博主是將log4j.properties文件加入到classpath下。博主一開始認(rèn)為我自己沒有日志輸出就可以不配置,就一直報錯啊
引入包的時候,只引入lib就可以了,多引了可能是存在重復(fù)或者版本不一的問題,增增減減鼓搗了好久也沒有搞出來,最后重新建了一個文件,只引入lib就可以啦。
參考文獻(xiàn)
官方文檔
Quartz的搭建,應(yīng)用
Quartz任務(wù)調(diào)度快速入門
Quartz2之入門實(shí)例
Quartz使用-入門使用(java定時任務(wù)實(shí)現(xiàn))
Quartz開源的作業(yè)調(diào)度框架