Quartz
是啥來着!不少太專業的話語我就先不說了!爲何!由於說得太專業,連我本身都矇蔽了!太專業的話語也須要從網上copy過來,何須呢!我就以我本身的理解,儘可能把我會的全部通俗易懂地記錄下來。說到這個框架,反正它就是用來執行定時任務的,什麼定時任務呢?好比說:java
你想天天中午12:00去食堂吃飯
設計模式
上面這句話能夠拆解爲三個部分:bash
(Trigger)
(Job)
(Scheduler)
上面的三點分別說明了Quartz
框架中最關鍵的三個組件,分別是觸發器
,定時任務
,調度者
。很是容易理解,觸發器就是告訴你何時定時任務該執行了!而調度者就是用來從宏觀方面協調每一個定時任務的執行的!app
Quartz
在不少地方採用了建造者設計模式,像Trigger
有對應的TriggerBuilder
,JobDetail
有對應的JobBuilder
。知道了使用了建造者模式,那麼咱們就能夠這樣來建立對象:框架
JobDetail job = JobBuilder.newJob(yourJobClass).withIdentity(jobName, jobGroupName).build();
複製代碼
在Quartz
中,每一個任務有本身對應的任務名稱和所屬的組名稱,每一個任務的名稱和所屬組名稱都是惟一的,若是指定不惟一,則報錯!ide
在Quartz
中建立(Scheduler)
則用到了工廠方法設計模式,可見通常框架中設計模式的應用是很是廣泛的!學習
Quartz
中默認在類路徑下使用quartz.properties
做爲配置文件,固然你也能夠在你的類路徑下建立一個一樣的名稱來進行覆蓋,好比我在Spring boot工程的resource
目錄下建立一個同名的文件來進行覆蓋,以下圖:ui
文件的屬性配置能夠參考官網的文檔,說得很是地詳細!點擊 quartz配置詳解spa
Quartz
的觸發器Trigger
時間支持Date
類型和cron
表達式,Spring中自帶的定時任務也提供了相應的cron表達式,對於什麼是cron
表達式,小編後期再寫一篇進行總結!設計
下面說說Quartz
在Spring boot應用中的使用,這可能會和網上不少的教程不一樣。
一、首先,咱們通常要求全局只配置一個Scheduler
對象實例,並且咱們想在啓動Spring boot
的同時去調用這個Scheduler
對象實例的start()
方法,因此後期咱們只須要動態將任務丟進這個實例中,或者從這個實例中移除任務便可。具體實現以下: 在工程中某個地方建立一個類StartSchedualer
:
@Component//這樣會被Spring boot掃描到
public class StartSchedualer implements CommandLineRunner {//實現該接口
@Override
public void run(String... args) throws Exception {
try {
GetSchedual.getSchedual().start();//獲取實例並啓動
} catch (SchedulerException e) {}
}
}
複製代碼
怎麼動態加入任務呢?
@RequestMapping("/add")
public static void addJob() throws SchedulerException {
JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job1", "group1").setJobData(null).build();
CronTrigger trigger = newTrigger().withIdentity("trigger1", "group1")
.withSchedule(cronSchedule("0/2 * * * * ?")).build();//每2秒執行一次任務
Date ft = GetSchedual.getSchedual().scheduleJob(job, trigger);//向Scheduler中註冊任務
}
複製代碼
怎麼刪除任務呢?
@RequestMapping("/remove")
//傳入你須要
public void remove(@RequestParam String triggerName, @RequestParam String triggerGroupName,
@RequestParam String jobName, @RequestParam String jobGroupName) {
try {
Scheduler sched = GetSchedual.getSchedual();//仍是獲取那個惟一的對象(單例的嘛!)
TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
//下面三個組件都需刪除
sched.pauseTrigger(triggerKey);// 中止觸發器
sched.unscheduleJob(triggerKey);// 移除觸發器
sched.deleteJob(JobKey.jobKey(jobName, jobGroupName));// 刪除任務
} catch (Exception e) {
throw new RuntimeException(e);
}
}
複製代碼
GetSchedual.java
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
public class GetSchedual {
private static SchedulerFactory factory = new StdSchedulerFactory();
public static Scheduler getSchedual() throws SchedulerException {
Scheduler schedual = factory.getScheduler();
return schedual;
}
}
複製代碼
pom.xml
<!-- quartz相關 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
複製代碼
最後,Quartz
也支持集羣,詳情能夠閱讀官網的文檔,栗子呢能夠下載官網源碼包,在源碼包的Example
中有提供!雖然它的源碼閱讀起來不難,但小編還得深刻學習!
以上是我將Quartz
與Spring boot整合的栗子,可能弄得很差!有問題歡迎指出,一塊兒交流,一塊兒進步!