Quartz入門(一)
下載與安裝
下載jar包脖捻,將lib包放入classpath中
概述
Quartz對任務調(diào)度的領域問題進行了高度的抽象,提出了調(diào)度器、任務和觸發(fā)器這3個核心的概念床未,并在org.quartz通過接口和類對重要的這些核心概念進行描述
- 調(diào)度器:調(diào)度器用于將與作業(yè)觸發(fā)器關聯(lián),一個作業(yè)可關聯(lián)多個觸發(fā)器,這樣每個觸發(fā)器被可以觸發(fā)的作業(yè)執(zhí)行;一個觸發(fā)器可用于控制多個作業(yè),觸發(fā)觸發(fā)時振坚,
全部作業(yè)將獲得調(diào)度薇搁。Quartz的調(diào)度器由Scheduler接口體現(xiàn). - 作業(yè):只需實現(xiàn)org.quartz.job接口即可。Job接口包含一個方法
execute()
,execute()
方法體是被調(diào)度的作業(yè)體渡八。一旦實現(xiàn)Job接口和execute()
方法啃洋,
Quartz確定作業(yè)運作的時候传货,它將調(diào)用execute()
方法體。 - 觸發(fā)器:有SimpleTrigger和CronTrigger兩種類型
一個簡單的例子
新建一個叫MyJob的類宏娄,實現(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("任務正在執(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實例
Scheduler scheduler = factory.getScheduler();
// 計算任務的開始時間,DateBuilder.evenMinuteDate方法是取下一個整數(shù)分鐘
Date runTime = DateBuilder.evenMinuteDate(new Date());
// 真正執(zhí)行的任務并不是Job接口的實例孵坚,而是用反射的方式實例化的一個JobDetail實例
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();
// 定義一個觸發(fā)器粮宛,startAt方法定義了任務應當開始的時間
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
// 將任務和Trigger放入scheduler
scheduler.scheduleJob(job, trigger);
scheduler.start();
try {
// 等待65秒,保證下一個整數(shù)分鐘出現(xiàn)卖宠,這里注意巍杈,如果主線程停止,任務是不會執(zhí)行的
Thread.sleep(65L * 1000L);
} catch (Exception e) {
}
// scheduler結(jié)束
scheduler.shutdown(true);
}
}
通過代碼可以看到幾個重要的類:
JobDetail:真正的任務內(nèi)容逗堵,任務本身是繼承Job接口的秉氧,但是真正的任務是JobBuilder通過反射的方式實例化的
JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job","group1").build()
Trigger:觸發(fā)器,定義任務應當開始的時間蜒秤,主要分為兩類SimpleTrigger,CronTrigger亚斋。當前例子是簡單觸發(fā)器作媚,CronTrigger主要用于處理quartz表達式定義的任務,比如每個月20號帅刊,每個星期一之類的纸泡。
// 定義一個觸發(fā)器,startAt方法定義了任務應當開始的時間 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
Scheduler:調(diào)度器赖瞒,現(xiàn)在我們有了要做的內(nèi)容女揭,有了做任務的時間,接下來栏饮,就把這兩個內(nèi)容填充到計劃任務Scheduler對象里面吧兔,到了時間它就可以自動運行啦。
scheduler.scheduleJob(job, trigger); scheduler.start();
注意事項
Quartz一般是通過日志打印的方式來執(zhí)行任務的袍嬉,所以一定要有日志配置境蔼。博主是將log4j.properties文件加入到classpath下。博主一開始認為我自己沒有日志輸出就可以不配置伺通,就一直報錯啊
引入包的時候箍土,只引入lib就可以了,多引了可能是存在重復或者版本不一的問題罐监,增增減減鼓搗了好久也沒有搞出來吴藻,最后重新建了一個文件,只引入lib就可以啦弓柱。
參考文獻
官方文檔
Quartz的搭建沟堡,應用
Quartz任務調(diào)度快速入門
Quartz2之入門實例
Quartz使用-入門使用(java定時任務實現(xiàn))
Quartz開源的作業(yè)調(diào)度框架