最近項目中用到了Quartz任務調度庫,在這里簡單介紹一下,最新版的Quartz的基本使用和語法。
開始使用Quartz:
1.下載Quartz
下載地址點這里,下載了之后可以看到lib文件,我們在這里需要用到的jar文件,quartz---.jar是Quartz實現(xiàn)的jar,其他的3個jar的Quartz日志所需要的jar,下圖這四個庫是必須要使用的:

2.任務具體實現(xiàn)
在Quartz中,所有的任務都必須實現(xiàn)Job接口,Job中只有一個execute(JobExecutionContext context)實現(xiàn)方法,我們的具體業(yè)務實現(xiàn)就得寫在這個方法里面,這個方法將會在觸發(fā)器滿足調度條件是觸發(fā).
參數(shù)JobExecutionContext可以用來設置調用結果Result,通過put或者set方法.
代碼示例:
package com.jelly.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class Job1 implements Job{
public void execute(JobExecutionContext arg0) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
System.out.println(sdf.format(new Date())+" ---- start Job");
}
}
JavaDoc截圖:

3.設置簡單調度任務
設置調度任務一共分為四個步驟
(1)實例化JobDetail(調度任務):
由于JobDetail是一個接口,所以必須通過JobBuilder實例化JobDetail,看一下具體代碼:
JobBuilder jobBuilder = JobBuilder.newJob(Job1.class);
jobBuilder.withIdentity("job1", "group1");
JobDetail jobDetail = jobBuilder.build();
通過JobBuilder的newJob方法設置需要執(zhí)行的Job任務類名,withIdentity是設置JobDetail的name和gruop(如果沒有設置的話,將會隨機生成name和group)最后通過build方法就可以實例化JobDetail.
(2)實例化Trigger(觸發(fā)器):
Trigger也是個接口,只能通過TriggerBuilder去實例化,具體代碼:
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity("tigger1", "group1");
triggerBuilder.startNow();
triggerBuilder.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(60).repeatForever());
Trigger trigger = triggerBuilder.build();
TriggerBuilder的newTrigger去獲取TriggerBuilder對象,設置name和group(不設置將會隨機生成),調用startNow設置Trigger開始的時間為當前時間,通過withSchedule設置觸發(fā)器的調度規(guī)則。最后通過build方法獲取對象.
SimpleScheduleBuilder先不用管是什么,在后面會解釋,理解為任務的觸發(fā)條件就行,在這里設置60秒重復一次,重復次數(shù)無限.
(3)為調度程序設置任務和觸發(fā)器,開始調度:
JobDetail和Trigger實例化完成之后,設置調度程序,開始調度任務.由于Scheduler是interface,無法直接實例化,通過JavaDoc知道只能通過SchedulerFactory來獲取,但是SchedulerFactory也是interface,最后找到了實現(xiàn)類StdSchedulerFactory,具體代碼:
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
通過StdSchedulerFactory的getDefaultScheduler獲取一個Scheduler,為Scheduler設置Job和Trigger,調用start開始調度.
還有一種獲取Scheduler的方式,由于StdSchedulerFactory實現(xiàn)了SchedulerFactory的接口,故可以直接實例化StdSchedulerFactory,然后通過getScheduler獲取Scheduler.
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
(4)關閉任務調度:
scheduler.shutdown();
4.觸發(fā)器的兩種模式
任務調度有兩種模式.一種是SimpleSchedule(簡單模式),這種只能實現(xiàn)簡單的調度,比如多少秒重復觸發(fā)
等簡單的任務調度。另外一種是CronSchedule(表達式模式),這種模式是基于Cron時間表達式.下面介紹一下這兩種模式:
(1)簡單模式
在這種模式下只能根據(jù)提供的Api指定一些簡單的時間重復調度,可以指定重復的次數(shù),repeatForever代表無限重復,其他重復次數(shù)可以通過withRepeatCount(int triggerRepeatCount)來指定.
triggerBuilder.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(60).repeatForever());
介紹一下常用的方法:
withIntervalInHours(int intervalInHours)設置幾小時重復一次
withIntervalInMinutes(int intervalInMinutes)設置幾分鐘重復一次
withIntervalInSeconds(int intervalInSeconds)設置幾秒鐘重復一次
(2)表達式模式
表達式模式就是可以通過時間表達式來具體指定在什么時間執(zhí)行任務,可以用來時間比較復雜的時間調度,在這里設置了每小時51分的時候執(zhí)行任務.
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(new CronExpression("0 51 * * * ? ")));
關于時間表達式的語法在這里就不重復介紹了,想了解的同學點這里.我覺得也沒必要去記,需要的時候可以借助這個工具去生成地址,如果不能滿足要求,再去找資料就行了.
完整代碼:
(1)簡單模式
package com.jelly.quartz;
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;
public class TestJob1 {
public static void main(String[] args) {
try {
//實例化JobDetail
JobBuilder jobBuilder = JobBuilder.newJob(Job1.class);
jobBuilder.withIdentity("job1", "group1");
JobDetail jobDetail = jobBuilder.build();
//實例化Trigger
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity("tigger1", "group1");
triggerBuilder.startNow();
triggerBuilder.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(60).repeatForever());
Trigger trigger = triggerBuilder.build();
//開始任務
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
(2)表達式模式
package com.jelly.quartz;
import org.quartz.CronExpression;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class TestJob2 {
public static void main(String[] args) {
try {
JobBuilder jobBuilder = JobBuilder.newJob(Job1.class);
jobBuilder.withIdentity("job1", "group1");
JobDetail jobDetail = jobBuilder.build();
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder.withIdentity("tigger1", "group1");
triggerBuilder.startNow();
triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(new CronExpression("0 51 * * * ? ")));
Trigger trigger = triggerBuilder.build();
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
打印結果:
(1)簡單模式
2016-12-05 06:01:45 ---- start Job
2016-12-05 06:02:45 ---- start Job
2016-12-05 06:03:45 ---- start Job
(2)表達式模式
2016-12-05 06:51:00 ---- start Job
2016-12-05 07:51:00 ---- start Job
2016-12-05 08:51:00 ---- start Job
參考:
JavaDoc
documentation