簡單說說Java 定時任務框架---Quartz

擁抱心中的夢想發表於2018-03-25

一、Quartz是啥來著!

很多太專業的話語我就先不說了!為什麼!因為說得太專業,連我自己都矇蔽了!太專業的話語也需要從網上copy過來,何必呢!我就以我自己的理解,儘量把我會的所有通俗易懂地記錄下來。說到這個框架,反正它就是用來執行定時任務的,什麼定時任務呢?比如說:

你想每天中午12:00去食堂吃飯

上面這句話可以拆解為三個部分:

  • 1、每天中午12:00(Trigger)
  • 2、吃飯(Job)
  • 3、你的大腦使你這麼做(Scheduler)

上面的三點分別說明了Quartz框架中最關鍵的三個元件,分別是觸發器定時任務排程者。非常容易理解,觸發器就是告訴你什麼時候定時任務該執行了!而排程者就是用來從巨集觀方面協調每個定時任務的執行的!

Quartz在很多地方採用了建造者設計模式,像Trigger有對應的TriggerBuilder,JobDetail有對應的JobBuilder。知道了使用了建造者模式,那麼我們就可以這樣來建立物件:

JobDetail job = JobBuilder.newJob(yourJobClass).withIdentity(jobName, jobGroupName).build();
複製程式碼

Quartz中,每個任務有自己對應的任務名稱和所屬的組名稱,每個任務的名稱和所屬組名稱都是唯一的,如果指定不唯一,則報錯!

Quartz中建立(Scheduler)則用到了工廠方法設計模式,可見一般框架中設計模式的應用是非常普遍的!

Quartz中預設在類路徑下使用quartz.properties作為配置檔案,當然你也可以在你的類路徑下建立一個同樣的名稱來進行覆蓋,比如我在Spring boot工程的resource目錄下建立一個同名的檔案來進行覆蓋,如下圖:

簡單說說Java 定時任務框架---Quartz

檔案的屬性配置可以參考官網的文件,說得非常地詳細!點選 quartz配置詳解

Quartz的觸發器Trigger時間支援Date型別和cron表示式,Spring中自帶的定時任務也提供了相應的cron表示式,對於什麼是cron表示式,小編後期再寫一篇進行總結!

二、Spring boot 整合 Quartz

下面說說Quartz在Spring boot應用中的使用,這可能會和網上很多的教程不同。

1、首先,我們一般要求全域性只配置一個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整合的栗子,可能弄得不好!有問題歡迎指出,一起交流,一起進步!

相關文章