quartz源碼解析--轉

來源:互聯網
上載者:User

標籤:

quartz源碼解析(一)  、

http://ssuupv.blog.163.com/blog//146156722013829111028966/

任何個人、任何企業、任何行業都會有作業調度的需求。舉幾個簡單的例子:

1、每個月都會發工資,每個月都要報銷等;

2、每個人每天都要吃飯和睡覺;

3、每個公司都有會計帳期,都需要向公司領導彙報月報、季報、年報等。

4、銀行和金融行業每天都需要日切等等。

 

對於個人,對作業調度的感知不是非常明確,但對於一個企業,一個好的作業調度可以為企業節省很多時間和金錢。俗話說,時間就是金錢,過高的資源投入到枯燥的任務中無疑是金錢和資源的浪費,隨著商務程序複雜性的提高,自動化流程和自動化作業調度更能凸顯出益處來。之所以自動化的出現,因為在做重複性工作時,人的效率和正確率遠低於電腦。把一系列任務自動安排到一個作業中,然後再為這個作業建立一個調度器,到時候這個作業就會自動執行了。

Quartz是經典的作業調度架構,在深入研究之初,先仿照quartz的原理,設計一個簡單的作業調度器,類圖如下:

 

 

1、  先看job類,這個類,非常簡單,只有一個execute方法,該方法是job具體執行的內容:

 

 

2、  jobdetail類,該類是對具體job類的封裝,包括jobName(id),job執行需要的運行時參數,在名為jobdata的hashMap中

 

 

 

 

 

3、  trigger類,記錄下次運行作業的時間和運行job的key:

 

 

4、  scheduler類,最重要的類,用來啟動和停止架構

 

 

 

 

 

5、  scheduler的執行是在scheduler的schedulerThread中執行;線程中最重要的是run方法體,另外還有一個halt方法用來停止線程。先看halt方法

 

 

Run方法體為:

 

至此所有的架構代碼都已經完成。註:沒有考慮NullPointException和多線程問題。

 

再看下測試代碼:

 

 

 

 

結果

 

 

 

系統按照下次已耗用時間來執行,並成功顯示結果。

本章只是在抽取quartz的核心處理邏輯的基礎智商,去除安全驗證和多線程同步問題編寫的基本調度任務。僅為拋磚引玉,為quartz源碼的解析打個基礎。

quartz架構分析(二)

http://ssuupv.blog.163.com/blog/static/146156722013829324461/

Quartz架構執行的任務需要寫在一個實現Job介面的類中,在實作類別中的execute(JobExecutionContext context)中執行相關的操作,通過實現Job介面來使你的Java 組件可以很簡單的被scheduler執行,下面是job介面:

 

 

 

如上,你會看到job觸發器出發時,job的execute方法會被執行。那麼,scheduler的job是通過何種方式建立和執行的呢。先來看看job的部署,job是通過jobdetail scheduler到架構中去的,然後通過getJobClass()方法擷取到job實作類別的class位元組碼的,通過jobFactory的newJob()方法反射出Java 的具體執行個體,然後在JobRunShell線程對象的run方法中執行。

1、  先看看jobdetail的建立,在quartz2.0中,jobdetail是通過jobbuilder建立

 

 

Jobbuilder通過靜態方法newjob()不同重載來建立Jobbuilder,通過withIdentity()重載設定參數,如下:

 

 

 

 

 

2、  建立號jobdetail後,scheduler通過線程類JobRunShell來執行Job。

通過initialize方法中調用JobFactory的newJob()建立Job執行個體。

 

JobFactory的newJob()方法通過反射使用預設無參數的構造方法實現job執行個體建立,如下:

 

 

Job的執行很簡單,直接調用execute方法即可,以下代碼省略中間檢查部分:

 

Job的實現和執行很簡單, 主要是商務邏輯,以下簡單的把類之間的關係整理下:

quartz源碼簡析(三)

http://ssuupv.blog.163.com/blog/static/14615672201382931053129/

Quartz Trigger 部分

Trigger用來記錄job任務的已耗用時間,運行次數等資訊。Trigger的基本類圖如下:

 

 

 

1、trigger介面主要提供trigger必備的一些參數資訊,如triggerkey等,在trigger介面中只提供了jobkey,key等資訊的get方法,並沒有set方法,於是trigger介面派生一個MutableTrigger介面用於提供set上述欄位值的方法。Trigger的其他子介面crontrigger和simpletrigger在提供了基本的trigger方法的基礎上針對不同類型的trigger加以不同形式的參數方法。

2、所有trigger的實作類別都是繼承自AbstractTrigger,AbstractTrigger並沒有提供任何特別的方法體,只是針對trigger介面的get方法和MutableTrigger介面的set方法對應的參數聲明為private變數。

3、quartz中存在3個可執行個體化trigger。CronTriggerImpl、SimpleTriggerImpl和CalendarItervalTrigger。主要是針對time時間的計算。

 

總體來說trigger還是比較簡單的

quartz源碼解析--轉

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.