因為某篇大牛文章推薦了所謂十個 java程式員必備的15個架構,位址在:這裡。 抱着甯可信其有,不可信其無的态度,将其中幾個不是很熟悉的内容看一看,并做筆記記錄。需要在短時間學的怎麼怎麼樣是不太現實的, 是以簡單記錄記錄。 今天的目标是至少記錄三個相關的架構筆記。 第一個:Quartz;
學習一個架構我覺得包括兩點:第一,知道它是幹什麼的; 第二,知道如何使用; 第三,知道大緻的原理。 有什麼用,如何使用可以在官方文檔上清楚的查到; 大緻原理最理想的方法就是調試。 是以下文将以這種思路展開。
1.Quartz是什麼:

直覺一點的場景是: 它可以用于定時任務任務的場景中。
2.Quartz如何使用:
導包什麼的那是必需的就不提了,主要看看它如何在項目中使用。
package com.automann;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
/**
* @author [email protected]
* @time 2018/11/25 10:53
*/
public class Main {
public static void main(String[] args) throws SchedulerException {
//從工廠中獲得排程執行個體
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
// 開始排程
scheduler.start();
// 定義任務并與我們指定的任務類綁定
JobDetail job = newJob(TheJob.class)
.withIdentity("job1", "group1")
.build();
// 觸發任務現在執行,并且每隔40秒執行一次
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startNow()
.withSchedule(simpleSchedule()
.withIntervalInSeconds(40)
.repeatForever())
.build();
//讓quartz用我們的觸發器去排程任務
scheduler.scheduleJob(job, trigger);
}
public static class TheJob implements Job{
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("hello quartz!");
}
}
}
執行結果:
在實踐過程中,有幾點需要注意:
1.任務類必須是public的,且必須包括無參構造;
2.必須包含日志架構slf4j; 但是要注意,它隻是一個标準,而沒有具體的實作,是以,至少需要一個它的實作類。 日志架構的具體用法見: java-web環境內建各種主流日志架構(jcl,jul,slf4j,log4j,logback)總結。
3.quartz的大緻原理:
在上面實際使用中,涉及到這幾個概念: 任務,排程器,觸發器; 那麼看它的大緻原理的時候,便可以從這幾個方面入手。
按照邏輯先後順序檢視:則應該是: 排程器>觸發器>任務
排程器:
它的執行個體預設由工廠環境提供,工廠環境執行個體的時候的一些代碼片段:
之後經過一個大概600行的方法,做了一些環境的初始化。 它最終的結果将會有以下的一些結果:
它的一個核心方法:start()。 看看它在某一個具體的排程器中是如何實作的:
總之,它的核心應該是開啟了一個監聽。 根據監聽對象的狀态做出相應的操作。
注意到,這個start()方法中并不蘊含類似于while()語句來用于阻塞線程的操作的功能。 它隻是單次執行的。 每次執行,就通知一遍注冊了的監聽器做相應操作。。
觸發器:
它的執行個體是通過工廠模式,以及 構造器模式。 通過構造器模式,可以很友善的設定一些參數。 它的所有的動作也隻是初始參數。 最終将構造出的執行個體交給排程器具體執行。
調用的是排程的scheduleJob(Job,Trigger)方法。 是以,有必要去看看它的實作代碼片段: