http://ssuupv.blog.163.com/blog//146156722013829111028966/安全
任何我的、任何企業、任何行業都會有做業調度的需求。舉幾個簡單的例子:多線程
一、每月都會發工資,每月都要報銷等;框架
二、每一個人天天都要吃飯和睡覺;測試
三、每一個公司都有會計賬期,都須要向公司領導彙報月報、季報、年報等。ui
四、銀行和金融行業天天都須要日切等等。spa
對於我的,對做業調度的感知不是很是明確,但對於一個企業,一個好的做業調度能夠爲企業節省不少時間和金錢。俗話說,時間就是金錢,太高的資源投入到枯燥的任務中無疑是金錢和資源的浪費,隨着業務流程複雜性的提升,自動化流程和自動化做業調度更能凸顯出益處來。之因此自動化的出現,由於在作重複性工做時,人的效率和正確率遠低於電腦。把一系列任務自動安排到一個做業中,而後再爲這個做業建立一個調度器,到時候這個做業就會自動執行了。線程
Quartz是經典的做業調度框架,在深刻研究之初,先仿照quartz的原理,設計一個簡單的做業調度器,類圖以下:設計
一、 先看job類,這個類,很是簡單,只有一個execute方法,該方法是job具體執行的內容:對象
二、 jobdetail類,該類是對具體job類的封裝,包括jobName(id),job執行須要的運行時參數,在名爲jobdata的hashMap中blog
三、 trigger類,記錄下次運行做業的時間和運行job的key:
四、 scheduler類,最重要的類,用來啓動和中止框架
五、 scheduler的執行是在scheduler的schedulerThread中執行;線程中最重要的是run方法體,另外還有一個halt方法用來中止線程。先看halt方法
Run方法體爲:
至此全部的框架代碼都已經完成。注:沒有考慮NullPointException和多線程問題。
再看下測試代碼:
結果
系統按照下次運行時間來執行,併成功顯示結果。
本章只是在抽取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方法中執行。
一、 先看看jobdetail的建立,在quartz2.0中,jobdetail是經過jobbuilder建立
Jobbuilder經過靜態方法newjob()不一樣重載來建立Jobbuilder,經過withIdentity()重載設置參數,以下:
二、 建立號jobdetail後,scheduler經過線程類JobRunShell來執行Job。
經過initialize方法中調用JobFactory的newJob()建立Job實例。
JobFactory的newJob()方法經過反射使用默認無參數的構造方法實現job實例建立,以下:
Job的執行很簡單,直接調用execute方法便可,如下代碼省略中間檢查部分:
Job的實現和執行很簡單, 主要是業務邏輯,如下簡單的把類之間的關係整理下:
http://ssuupv.blog.163.com/blog/static/14615672201382931053129/
Quartz Trigger 部分
Trigger用來記錄job任務的運行時間,運行次數等信息。Trigger的基本類圖以下:
一、trigger接口主要提供trigger必備的一些參數信息,如triggerkey等,在trigger接口中只提供了jobkey,key等信息的get方法,並無set方法,因而trigger接口派生一個MutableTrigger接口用於提供set上述字段值的方法。Trigger的其餘子接口crontrigger和simpletrigger在提供了基本的trigger方法的基礎上針對不一樣類型的trigger加以不一樣形式的參數方法。
二、全部trigger的實現類都是繼承自AbstractTrigger,AbstractTrigger並無提供任何特別的方法體,只是針對trigger接口的get方法和MutableTrigger接口的set方法對應的參數聲明爲private變量。
三、quartz中存在3個可實例化trigger。CronTriggerImpl、SimpleTriggerImpl和CalendarItervalTrigger。主要是針對time時間的計算。
整體來講trigger仍是比較簡單的