quartz源码解析--转
quartz源碼解析(一) ?、
http://ssuupv.blog.163.com/blog//146156722013829111028966/
任何個(gè)人、任何企業(yè)、任何行業(yè)都會(huì)有作業(yè)調(diào)度的需求。舉幾個(gè)簡(jiǎn)單的例子:
1、每個(gè)月都會(huì)發(fā)工資,每個(gè)月都要報(bào)銷(xiāo)等;
2、每個(gè)人每天都要吃飯和睡覺(jué);
3、每個(gè)公司都有會(huì)計(jì)帳期,都需要向公司領(lǐng)導(dǎo)匯報(bào)月報(bào)、季報(bào)、年報(bào)等。
4、銀行和金融行業(yè)每天都需要日切等等。
?
對(duì)于個(gè)人,對(duì)作業(yè)調(diào)度的感知不是非常明確,但對(duì)于一個(gè)企業(yè),一個(gè)好的作業(yè)調(diào)度可以為企業(yè)節(jié)省很多時(shí)間和金錢(qián)。俗話說(shuō),時(shí)間就是金錢(qián),過(guò)高的資源投入到枯燥的任務(wù)中無(wú)疑是金錢(qián)和資源的浪費(fèi),隨著業(yè)務(wù)流程復(fù)雜性的提高,自動(dòng)化流程和自動(dòng)化作業(yè)調(diào)度更能凸顯出益處來(lái)。之所以自動(dòng)化的出現(xiàn),因?yàn)樵谧鲋貜?fù)性工作時(shí),人的效率和正確率遠(yuǎn)低于電腦。把一系列任務(wù)自動(dòng)安排到一個(gè)作業(yè)中,然后再為這個(gè)作業(yè)創(chuàng)建一個(gè)調(diào)度器,到時(shí)候這個(gè)作業(yè)就會(huì)自動(dòng)執(zhí)行了。
Quartz是經(jīng)典的作業(yè)調(diào)度框架,在深入研究之初,先仿照quartz的原理,設(shè)計(jì)一個(gè)簡(jiǎn)單的作業(yè)調(diào)度器,類(lèi)圖如下:
?
?
1、??先看job類(lèi),這個(gè)類(lèi),非常簡(jiǎn)單,只有一個(gè)execute方法,該方法是job具體執(zhí)行的內(nèi)容:
?
?
2、??jobdetail類(lèi),該類(lèi)是對(duì)具體job類(lèi)的封裝,包括jobName(id),job執(zhí)行需要的運(yùn)行時(shí)參數(shù),在名為jobdata的hashMap中
?
?
?
?
?
3、??trigger類(lèi),記錄下次運(yùn)行作業(yè)的時(shí)間和運(yùn)行job的key:
?
?
4、??scheduler類(lèi),最重要的類(lèi),用來(lái)啟動(dòng)和停止框架
?
?
?
?
?
5、??scheduler的執(zhí)行是在scheduler的schedulerThread中執(zhí)行;線程中最重要的是run方法體,另外還有一個(gè)halt方法用來(lái)停止線程。先看halt方法
?
?
Run方法體為:
?
至此所有的框架代碼都已經(jīng)完成。注:沒(méi)有考慮NullPointException和多線程問(wèn)題。
?
再看下測(cè)試代碼:
?
?
?
?
結(jié)果
?
?
?
系統(tǒng)按照下次運(yùn)行時(shí)間來(lái)執(zhí)行,并成功顯示結(jié)果。
本章只是在抽取quartz的核心處理邏輯的基礎(chǔ)智商,去除安全驗(yàn)證和多線程同步問(wèn)題編寫(xiě)的基本調(diào)度任務(wù)。僅為拋磚引玉,為quartz源碼的解析打個(gè)基礎(chǔ)。
quartz框架分析(二)
http://ssuupv.blog.163.com/blog/static/146156722013829324461/
Quartz框架執(zhí)行的任務(wù)需要寫(xiě)在一個(gè)實(shí)現(xiàn)Job接口的類(lèi)中,在實(shí)現(xiàn)類(lèi)中的execute(JobExecutionContext context)中執(zhí)行相關(guān)的操作,通過(guò)實(shí)現(xiàn)Job接口來(lái)使你的Java?組件可以很簡(jiǎn)單的被scheduler執(zhí)行,下面是job接口:
?
?
?
如上,你會(huì)看到j(luò)ob觸發(fā)器出發(fā)時(shí),job的execute方法會(huì)被執(zhí)行。那么,scheduler的job是通過(guò)何種方式創(chuàng)建和執(zhí)行的呢。先來(lái)看看job的部署,job是通過(guò)jobdetail scheduler到框架中去的,然后通過(guò)getJobClass()方法獲取到j(luò)ob實(shí)現(xiàn)類(lèi)的class字節(jié)碼的,通過(guò)jobFactory的newJob()方法反射出Java?的具體實(shí)例,然后在JobRunShell線程對(duì)象的run方法中執(zhí)行。
1、??先看看jobdetail的創(chuàng)建,在quartz2.0中,jobdetail是通過(guò)jobbuilder創(chuàng)建
?
?
Jobbuilder通過(guò)靜態(tài)方法newjob()不同重載來(lái)創(chuàng)建Jobbuilder,通過(guò)withIdentity()重載設(shè)置參數(shù),如下:
?
?
?
?
?
2、??創(chuàng)建號(hào)jobdetail后,scheduler通過(guò)線程類(lèi)JobRunShell來(lái)執(zhí)行Job。
通過(guò)initialize方法中調(diào)用JobFactory的newJob()創(chuàng)建Job實(shí)例。
?
JobFactory的newJob()方法通過(guò)反射使用默認(rèn)無(wú)參數(shù)的構(gòu)造方法實(shí)現(xiàn)job實(shí)例創(chuàng)建,如下:
?
?
Job的執(zhí)行很簡(jiǎn)單,直接調(diào)用execute方法即可,以下代碼省略中間檢查部分:
?
Job的實(shí)現(xiàn)和執(zhí)行很簡(jiǎn)單,?主要是業(yè)務(wù)邏輯,以下簡(jiǎn)單的把類(lèi)之間的關(guān)系整理下:
quartz源碼簡(jiǎn)析(三)
http://ssuupv.blog.163.com/blog/static/14615672201382931053129/
Quartz Trigger?部分
Trigger用來(lái)記錄job任務(wù)的運(yùn)行時(shí)間,運(yùn)行次數(shù)等信息。Trigger的基本類(lèi)圖如下:
?
?
?
1、trigger接口主要提供trigger必備的一些參數(shù)信息,如triggerkey等,在trigger接口中只提供了jobkey,key等信息的get方法,并沒(méi)有set方法,于是trigger接口派生一個(gè)MutableTrigger接口用于提供set上述字段值的方法。Trigger的其他子接口crontrigger和simpletrigger在提供了基本的trigger方法的基礎(chǔ)上針對(duì)不同類(lèi)型的trigger加以不同形式的參數(shù)方法。
2、所有trigger的實(shí)現(xiàn)類(lèi)都是繼承自AbstractTrigger,AbstractTrigger并沒(méi)有提供任何特別的方法體,只是針對(duì)trigger接口的get方法和MutableTrigger接口的set方法對(duì)應(yīng)的參數(shù)聲明為private變量。
3、quartz中存在3個(gè)可實(shí)例化trigger。CronTriggerImpl、SimpleTriggerImpl和CalendarItervalTrigger。主要是針對(duì)time時(shí)間的計(jì)算。
?
總體來(lái)說(shuō)trigger還是比較簡(jiǎn)單的
?
轉(zhuǎn)載于:https://www.cnblogs.com/davidwang456/p/3878625.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專(zhuān)家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的quartz源码解析--转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 基于 Quartz 开发企业级任务调度应
- 下一篇: Using SSL Certificat