認識Quartz

定時任務框架,基於數據庫的高可用方案。

概念瞭解

Job
表示一個工作,要執行的具體內容。此接口中只有一個方法
void execute(JobExecutionContext context)

JobDetail
JobDetail表示一個具體的可執行的調度程序,Job是這個可執行程調度程序所要執行的內容,另外JobDetail還包含了這個任務調度的方案和策略。

Trigger代表一個調度參數的配置,什麼時候去調。

Scheduler代表一個調度容器,一個調度容器中可以註冊多個JobDetail和Trigger。當Trigger與JobDetail組合,就可以被Scheduler容器調度了。

比如項目多機部署,同一個定時任務,在不允許重複執行的場景,使用Quartz實現,而Quartz基於數據庫的鎖實現。

在quartz的集羣解決方案裏有張表scheduler_locks,quartz採用了悲觀鎖的方式對triggers表進行行加鎖,以保證任務同步的正確性。一旦某一個節點上面的線程獲取了該鎖,那麼這個Job就會在這臺機器上被執行,同時這個鎖就會被這臺機器佔用。同時另外一臺機器也會想要觸發這個任務,但是鎖已經被佔用了,就只能等待,直到這個鎖被釋放。之後會看trigger狀態,如果已經被執行了,則不會執行了。

缺點:
但是對於大量的短任務,各個節點都會搶佔數據庫鎖,這樣就出現大量的線程等待資源。


關於Quartz在實際項目中的使用,可以關注若依官網,下載若依基本框架,瞭解定時任務的實現,本人也是在學習若依框架的過程中,使用到定時任務,
基本流程是:
  1 首先頁面支持定時任務的創建和執行和失效等,
  2 後臺ScheduleUtils基於是否併發調用不同的類,但其實,點下去對比可以看到,實際上QuartzJobExecution.class 和  QuartzDisallowConcurrentExecution.class 調用的是同一個方法method.invoke(bean),內部參數處理也並不涉及Job的concurrent屬性,爲什麼這麼寫還沒理解,
   3 最後是基於數據庫,創建數據庫的定時任務的數據,通過java後臺讀取定時任務執行的類和方法.

經常閱讀代碼,學習別人的設計思路。

 

學習是最公平的事!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章