quartz源碼分析(四)

Quartz 核心部分是quartz的scheduler運行

1、首先看下quartz的一個實例的運行流程圖:

             

Scheduler的基本執行過程如上圖所示,但是具體的實現確各有個的不同,如第一章所講的也是一種實現,當然只是最簡單的實現,下面就結合quartz框架提供的一個實際的例子,講解scheduler的標準stdscheduler的執行過程。

先看看本部分涉及的一些類的簡單關係


 

最主要的類是QuartzSchedulerThread,他承載了所有運行環境中所有需要的參數,並所有的運行方法都是在更改QuartzSchedulerThread的變量,從而來控制線程運行方法run的執行流程。Resources僅僅是資源類,存儲基本的資源,signaler類是信號量類,控制run的執行過程。QuartzScheduler是StdScheduler的代理,他直接除了scheduler的所有操作。Thread的中採用一個final類型的sigLock做爲信號量,並使用halt和paused表示線程的終止和暫停。

1、先創建Schedulerfactory。使用SchedulerFactory的實現類StdSchedulerFactory創建一個SchedulerFactory實例。在創建factory之初,jvm不實例化任何成員變量,僅僅是一個空的構造方法。

2、獲取scheduler。通過schedulerfactory獲取scheduler。獲取scheduler需要一系列的參數,這些參數是配置在名爲quartz.properties的文件之中。先從系統中(即System.getProperties)獲取名爲org.quartz.properties的變量值,如果不存在,默認爲quartz.properties,從當前的運行環境找名稱爲quartz.properties的屬性文件加載,還是不存在,則去當前類加載器目錄,也就是classpath中加載。然後把系統的屬性同樣加載到properties,最後構造quartz特有的屬性對象。

 

3、jobdetail和trigger的創建過程很簡單,以上已經提及,在此簡述過程圖:

         

4、當scheduler實例化後,並且jobdetail和trigger已經實例化,下面就開始scheduler任務了。Scheduler的過程:

1)先從stdscheduler中獲取QuartzScheduler,Stdscheduler是QuartzScheduler的代理,所有方法sheduler的方法的實際運行都在QuartzScheduler中。

2)scheduler前檢查:檢查scheduler的狀態,jobdetail和trigger等是否爲空

3)store job。先對jobdetail做clone,判斷現存的jobkey列表中是否存在,如果存在,異常。如果不存在,把jobdetail分別爲group和key存儲在內存中。

4)store trigger。先對trigger做clone,判斷triggerkey列表中是否存在。如果存在使用removetrigger移除,不過此方法有明顯BUG,並且一般不會使用,在此不做贅述。把trigger添加到arraylist中,把trigger分別爲group和key存儲在內存中。再判斷trigger不是被暫停狀態時,添加到treeset中。

5)notify scheduler監聽器job被添加。

6)通知。之前沒說的一個重要點,在這裏用上了。QuartzSchedulerThread,這個thread線程類是在QuartzScheduler對象創建的時候手工建立起來的,只是對多線程進行一個支持。線程Thread在穿件過程中幾個非常重要的變量是,halted=new AtmicBoolean(false);用來原子判斷線程的狀態,另外線程中的一個重要的信號量爲final Object sigLock = new Object(),此對象控制了線程的wait和notify函數。QuartzSchedulerThread在QuartzScheduler在創建的的時候,就已經運行線程啓動方法運行,只是此時的paused狀態爲true,表示目前線程是暫停狀態。

隨後更新當前調用trigger的下次運行時間並複製給signaledNextFireTime,然後通知schedulerThread去重新分配調用任務。

7)notify scheduler監聽器trigger被添加。

此步驟的任務執行過程爲:

 


5、scheduler start:此不只是通過代理的更改模式更新QuartzSchedulerThread的paused的值爲false,使得線程的run方法可以去執行job任務。

6、scheduler shutdown 關閉scheduler的相關資源,並把非守護線程退出。

至此,quartz分析結束。

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