quartz源码解析--转
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還是比較簡單的
?
轉載于:https://www.cnblogs.com/davidwang456/p/3878625.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的quartz源码解析--转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于 Quartz 开发企业级任务调度应
- 下一篇: Using SSL Certificat