1. 程式人生 > >Quartz原始碼分析(一)------ 以執行緒等待的方式實現按時間排程

Quartz原始碼分析(一)------ 以執行緒等待的方式實現按時間排程

Quartz是運用最廣的任務排程框架,它最核心的組成部分是Scheduler、Trigger、JobDetail,然後給Scheduler配置個執行緒QuartzSchedulerThread,此執行緒在Scheduler初始化時啟動,等待Scheduler start,然後從JobStore裡拿到最近要觸發的Trigger,以執行緒等待的方式等到trigger觸發時間點,之後就是執行trigger所關聯的JobDetail,最後清掃戰場。Scheduler初始化、start和trigger執行的時序圖如下所示:

其中,最核心的地方是QuartzSchedulerThread執行機制。下面解析一下它的run方法:

 以上是run的最開頭的一段,不難看出這是在等待scheduler的start,實際上Quartz就是通過執行緒的wait或sleep來實現時間排程。繼續看程式碼:

這段程式碼是從jobStore裡拿到下一個要執行的trigger,一般情況下jobStore使用的是RAMJobStore,即trigger等相關資訊存放在記憶體裡,如果需要把任務持久化就得使用可持久化JobStore。繼續看程式碼:

 

此段程式碼是計算下一個trigger的執行時間和現在系統時間的差,然後通過迴圈執行緒sleep的方式暫停住此執行緒,一直等到trigger的執行時間點。繼續看程式碼:

此段程式碼就是包裝trigger,然後通過以JobRunShell為載體,在threadpool裡執行trigger所關聯的jobDetail。

之後的程式碼就是清掃戰場,就不在累述。