Quartz原理分析

一挽拂、Quartz概念

Quartz是一個(gè)優(yōu)秀的任務(wù)調(diào)度框架晃洒, 具有以下特點(diǎn):

  • 強(qiáng)大的調(diào)度功能损谦,例如支持豐富多樣的調(diào)度方法,可以滿足各種常規(guī)及特殊需求找颓;
  • 負(fù)載均衡
  • 高可用

調(diào)度器:scheduler

任務(wù)調(diào)度的控制器合愈,負(fù)責(zé)定時(shí)任務(wù)的調(diào)度,并且提供任務(wù)和觸發(fā)器的增刪改查等api方法击狮。

任務(wù):job

job是實(shí)際被調(diào)度的任務(wù)佛析,每個(gè)任務(wù)必須指定具體執(zhí)行任務(wù)的實(shí)現(xiàn)類,實(shí)現(xiàn)類需要繼承QuartzJobBean或者實(shí)現(xiàn)org.quartz.Job接口彪蓬,具體的業(yè)務(wù)邏輯寫在execute方法里面寸莫。
是否支持并發(fā)的注解:@DisallowConcurrentExecution

觸發(fā)器:trigger

trigger用來定義調(diào)度時(shí)間的概念,即按什么樣時(shí)間規(guī)則去觸發(fā)任務(wù)档冬。主要幾種類型:

  • SimpleTrigger:簡單觸發(fā)器储狭,從某個(gè)時(shí)間開始,每隔多少時(shí)間觸發(fā)捣郊,重復(fù)多少次辽狈。
  • CronTrigger:使用cron表達(dá)式定義觸發(fā)的時(shí)間規(guī)則,如"0 0 0,2,4 1/1 * ? *" 表示每天的0呛牲,2刮萌,4點(diǎn)觸發(fā)。
  • DailyTimeIntervalTrigger:每天中的一個(gè)時(shí)間段娘扩,每N個(gè)時(shí)間單元觸發(fā)着茸,時(shí)間單元可以是毫秒,秒琐旁,分涮阔,小時(shí)
  • CalendarIntervalTrigger:每N個(gè)時(shí)間單元觸發(fā),時(shí)間單元可以是毫秒灰殴,秒敬特,分,小時(shí),日伟阔,月辣之,年。

trigger狀態(tài):
-WAITING皱炉,

  • ACQUIRED怀估,
  • EXECUTING,
  • COMPLETE合搅,
  • BLOCKED多搀,
  • ERROR,
  • PAUSED灾部,
  • PAUSED_BLOCKED康铭,
  • DELETED
Quartz核心元素關(guān)系圖.png
Quartz線程視圖.png

Scheduler 調(diào)度線程主要有兩個(gè): 執(zhí)行常規(guī)調(diào)度的線程,和執(zhí)行 misfired trigger 的線程梳猪。常規(guī)調(diào)度線程輪詢存儲的所有 trigger,如果有需要觸發(fā)的 trigger蒸痹,即到達(dá)了下一次觸發(fā)的時(shí)間春弥,則從任務(wù)執(zhí)行線程池獲取一個(gè)空閑線程,執(zhí)行與該 trigger 關(guān)聯(lián)的任務(wù)叠荠。Misfire 線程是掃描所有的 trigger匿沛,查看是否有 misfired trigger,如果有的話根據(jù) misfire 的策略分別處理榛鼎。

Quartz 調(diào)度線程流程圖

未正常觸發(fā)的任務(wù):misfire job

沒有在正常觸發(fā)時(shí)間點(diǎn)觸發(fā)的任務(wù)逃呼。主要由一下幾種情況導(dǎo)致:

  • 觸發(fā)時(shí)間在應(yīng)用不可用的時(shí)間內(nèi),比如重啟
  • 上次的執(zhí)行時(shí)間過長者娱,超過了下次觸發(fā)的時(shí)間
  • 任務(wù)被暫停一段時(shí)間后抡笼,重新被調(diào)度的時(shí)間在下次觸發(fā)時(shí)間之后

處理misfire job的策略,需要在創(chuàng)建trigger的時(shí)候配置黄鳍,每種trigger對應(yīng)的枚舉值都不同推姻,具體在接口里面有定義。CronTrigger有2種處理misfire的策略:

處理策略 描述
MISFIRE_INSTRUCTION_FIRE_ONCE_NOW 立即觸發(fā)一次
MISFIRE_INSTRUCTION_DO_NOTHING 忽略框沟,不處理藏古,等待下次觸發(fā)

之間的關(guān)系:

scheduler由工廠類SchedulerFactory創(chuàng)建,主要負(fù)責(zé)job和trigger的持久化管理忍燥,包括新增拧晕、刪除、修改梅垄、觸發(fā)厂捞、暫停、恢復(fù)調(diào)度、停止調(diào)度等蔫敲;

一個(gè)job可以關(guān)聯(lián)多個(gè)trigger饲嗽,但是一個(gè)trigger只能關(guān)聯(lián)一個(gè)job。

Quzrtz執(zhí)行原理

單機(jī)模式

單機(jī)模式基本使用

(TODO)

單機(jī)模式原理分析

  1. scheduler是一個(gè)計(jì)劃調(diào)度器容器(總部)奈嘿,容器里面可以盛放眾多的JobDetail和trigger貌虾,當(dāng)容器啟動(dòng)后,里面的每個(gè)JobDetail都會(huì)根據(jù)trigger按部就班自動(dòng)去執(zhí)行裙犹。
  2. JobDetail是一個(gè)可執(zhí)行的工作尽狠,它本身可能是有狀態(tài)的。
  3. Trigger代表一個(gè)調(diào)度參數(shù)的配置叶圃,什么時(shí)候去調(diào)袄膏。
    4.當(dāng)JobDetail和Trigger在scheduler容器上注冊后,形成了裝配好的作業(yè)(JobDetail和Trigger所組成的一對兒)掺冠,就可以伴隨容器啟動(dòng)而調(diào)度執(zhí)行了沉馆。
  4. scheduler是個(gè)容器,容器中有一個(gè)線程池德崭,用來并行調(diào)度執(zhí)行每個(gè)作業(yè)斥黑,這樣可以提高容器效率。
quartz原理圖

集群模式

Quartz的集群模式指的是一個(gè)集群下多個(gè)節(jié)點(diǎn)管理同一批任務(wù)的調(diào)度眉厨,通過共享數(shù)據(jù)庫的方式實(shí)現(xiàn)锌奴,保證同一個(gè)任務(wù)到達(dá)觸發(fā)時(shí)間的時(shí)候氛什,只有一臺機(jī)器去執(zhí)行該任務(wù)然低。每個(gè)節(jié)點(diǎn)部署一個(gè)單獨(dú)的quartz實(shí)例,相互之間沒有直接數(shù)據(jù)通信检柬。

集群模式基本使用

(TODO)


Quartz集群模式部署

集群模式原理分析

quartz集群是通過數(shù)據(jù)庫表來感知其他的應(yīng)用的服球,各個(gè)節(jié)點(diǎn)之間并沒有直接的通信茴恰。只有使用持久的JobStore才能完成Quartz集群。
數(shù)據(jù)庫表:以前有12張表斩熊,現(xiàn)在只有11張表琐簇,現(xiàn)在沒有存儲listener相關(guān)的表,多了QRTZ_SIMPROP_TRIGGERS表:

Table name Description
QRTZ_CALENDARS 存儲Quartz的Calendar信息
QRTZ_CRON_TRIGGERS 存儲CronTrigger座享,包括Cron表達(dá)式和時(shí)區(qū)信息
QRTZ_FIRED_TRIGGERS 存儲與已觸發(fā)的Trigger相關(guān)的狀態(tài)信息婉商,以及相聯(lián)Job的執(zhí)行信息
QRTZ_PAUSED_TRIGGER_GRPS 存儲已暫停的Trigger組的信息
QRTZ_SCHEDULER_STATE 存儲少量的有關(guān)Scheduler的狀態(tài)信息,和別的Scheduler實(shí)例
QRTZ_LOCKS 存儲程序的悲觀鎖的信息
QRTZ_JOB_DETAILS 存儲每一個(gè)已配置的Job的詳細(xì)信息
QRTZ_SIMPLE_TRIGGERS 存儲簡單的Trigger渣叛,包括重復(fù)次數(shù)丈秩、間隔、以及已觸的次數(shù)
QRTZ_BLOG_TRIGGERS Trigger作為Blob類型存儲
QRTZ_TRIGGERS 存儲已配置的Trigger的信息
QRTZ_SIMPROP_TRIGGERS

QRTZ_LOCKS就是Quartz集群實(shí)現(xiàn)同步機(jī)制的行鎖表,包括以下幾個(gè)鎖:

  • CALENDAR_ACCESS
  • JOB_ACCESS
  • MISFIRE_ACCESS
  • STATE_ACCESS
  • TRIGGER_ACCESS

負(fù)責(zé)任務(wù)調(diào)度的幾個(gè)線程:
(1)任務(wù)執(zhí)行線程:通常使用一個(gè)線程池(SimpleThreadPool)維護(hù)一組線程淳衙,負(fù)責(zé)實(shí)際每個(gè)job的執(zhí)行蘑秽。
(2)Scheduler調(diào)度線程QuartzSchedulerThread :輪詢存儲的所有 trigger饺著,如果有需要觸發(fā)的 trigger,即到達(dá)了下一次觸發(fā)的時(shí)間肠牲,則從任務(wù)執(zhí)行線程池獲取一個(gè)空閑線程幼衰,執(zhí)行與該 trigger 關(guān)聯(lián)的任務(wù)。
(3)處理misfire job的線程MisfireHandler:輪訓(xùn)所有misfire的trigger缀雳,原理就是從數(shù)據(jù)庫中查詢所有下次觸發(fā)時(shí)間小于當(dāng)前時(shí)間的trigger渡嚣,按照每個(gè)trigger設(shè)定的misfire策略處理這些trigger。

參考資料

  1. Quartz集群原理分析
  2. 深入解讀Quartz的原理
  3. quartz (從原理到應(yīng)用)詳解篇
  4. 美團(tuán)技術(shù)團(tuán)隊(duì) Quartz應(yīng)用與集群原理分析
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肥印,一起剝皮案震驚了整個(gè)濱河市识椰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌深碱,老刑警劉巖腹鹉,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異敷硅,居然都是意外死亡功咒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門绞蹦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來力奋,“玉大人,你說我怎么就攤上這事坦辟】睿” “怎么了章办?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵锉走,是天一觀的道長。 經(jīng)常有香客問我藕届,道長挪蹭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任休偶,我火速辦了婚禮梁厉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踏兜。我一直安慰自己词顾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布碱妆。 她就那樣靜靜地躺著肉盹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪疹尾。 梳的紋絲不亂的頭發(fā)上上忍,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天骤肛,我揣著相機(jī)與錄音,去河邊找鬼窍蓝。 笑死腋颠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吓笙。 我是一名探鬼主播淑玫,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼观蓄!你這毒婦竟也來了混移?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤侮穿,失蹤者是張志新(化名)和其女友劉穎歌径,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亲茅,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡回铛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了克锣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茵肃。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖袭祟,靈堂內(nèi)的尸體忽然破棺而出验残,到底是詐尸還是另有隱情,我是刑警寧澤巾乳,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布您没,位于F島的核電站,受9級特大地震影響胆绊,放射性物質(zhì)發(fā)生泄漏氨鹏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一压状、第九天 我趴在偏房一處隱蔽的房頂上張望仆抵。 院中可真熱鬧,春花似錦种冬、人聲如沸镣丑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莺匠。三九已至,卻和暖如春谷婆,著一層夾襖步出監(jiān)牢的瞬間慨蛙,已是汗流浹背辽聊。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留期贫,地道東北人跟匆。 一個(gè)月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像通砍,于是被迫代替她去往敵國和親玛臂。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容