學(xué)習(xí)quartz首先了解三個(gè)概念:
調(diào)度器:負(fù)責(zé)調(diào)度作業(yè)和觸發(fā)器;
觸發(fā)器:設(shè)置作業(yè)執(zhí)行的時(shí)間、參數(shù)、條件等;(簡(jiǎn)單觸發(fā)器和Cron觸發(fā)器)
作業(yè):定時(shí)任務(wù)內(nèi)容,被執(zhí)行的程序;
下載必要的jar包,直接去官網(wǎng)下載,將quartz-x.x.x.jar 和core 和/或 optional 文件夾中的 jar 文件放在項(xiàng)目的文件夾或項(xiàng)目的類路徑中
Quartz的幾個(gè)核心的接口和類為:
Job接口:自己寫的“定時(shí)程序”實(shí)現(xiàn)此接口的void execute(JobExecutionContext arg0)方法,Job還有一類為有狀態(tài)的StatefulJob接口,如果我們需要在上一個(gè)作業(yè)執(zhí)行完后,根據(jù)其執(zhí)行結(jié)果再進(jìn)行下次作業(yè)的執(zhí)行,則需要實(shí)現(xiàn)此接口。
Trigger抽象類:調(diào)度類(Scheduler)在時(shí)間到時(shí)調(diào)用此類,再由trigger類調(diào)用指定的定時(shí)程序。
Quertz中提供了兩類觸發(fā)器為:SimpleTrigger,CronTrigger。前者用于實(shí)現(xiàn)比較
簡(jiǎn)單的定時(shí)功能,例如幾點(diǎn)開始,幾點(diǎn)結(jié)束,隔多長(zhǎng)時(shí)間執(zhí)行,共執(zhí)行多少次等,后者提供了使用表達(dá)式來描述定時(shí)功能,因此適用于比較復(fù)雜的定時(shí)描述,例如每
個(gè)月的最后一個(gè)周五,每周的周四等。
JobDetail類:具體某個(gè)定時(shí)程序的詳細(xì)描述,包括Name,Group,JobDataMap等。
JobExecutionContext類:定時(shí)程序執(zhí)行的run-time的上下文環(huán)境,用于得到當(dāng)前執(zhí)行的Job的名字,配置的參數(shù)等。
JobDataMap類:用于描述一個(gè)作業(yè)的參數(shù),參數(shù)可以為任何基本類型例如String,float等,也可為某個(gè)對(duì)象的引用.
JobListener,TriggerListener接口:用于監(jiān)聽觸發(fā)器狀態(tài)和作業(yè)掃行狀態(tài),在特寫狀態(tài)執(zhí)行相應(yīng)操作。
JobStore類:在哪里執(zhí)行定進(jìn)程序,可選的有在內(nèi)存中,在數(shù)據(jù)庫(kù)中。
開始:邊看例題邊學(xué)習(xí),首先從簡(jiǎn)單觸發(fā)器開始……
1、作業(yè)通過實(shí)現(xiàn) org.quartz.job
接口,可以使 Java 類變成可執(zhí)行的。這個(gè)類用一條非常簡(jiǎn)單的輸出語(yǔ)句覆蓋了 execute(JobExecutionContext context)
方法。
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class SimpleQuartzJob implements Job {
public SimpleQuartzJob() {
}
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("In SimpleQuartzJob - executing its JOB at "
+ new Date() + " by " + context.getTrigger().getName());
}
}
2、觸發(fā)器和調(diào)度器
public void task() throws SchedulerException
{
//通過SchedulerFactory來獲取一個(gè)調(diào)度器
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
//引進(jìn)作業(yè)程序
JobDetail jobDetail =
new JobDetail("jobDetail-s1", "jobDetailGroup-s1", SimpleQuartzJob.class);
//new一個(gè)觸發(fā)器
SimpleTrigger simpleTrigger =
new SimpleTrigger("simpleTrigger", "triggerGroup-s1");
//設(shè)置作業(yè)啟動(dòng)時(shí)間
long ctime = System.currentTimeMillis();
simpleTrigger.setStartTime(new Date(ctime));
//設(shè)置作業(yè)執(zhí)行間隔
simpleTrigger.setRepeatInterval(10000);
//設(shè)置作業(yè)執(zhí)行次數(shù)
simpleTrigger.setRepeatCount(10);
//設(shè)置作業(yè)執(zhí)行優(yōu)先級(jí)默認(rèn)為5
//simpleTrigger.setPriority(10);
//作業(yè)和觸發(fā)器設(shè)置到調(diào)度器中
scheduler.scheduleJob(jobDetail, simpleTrigger);
//啟動(dòng)調(diào)度器
scheduler.start();
}
一個(gè)簡(jiǎn)單的quartz任務(wù)就完成了