1.背景介紹
Quartz是一個(gè)作業(yè)調(diào)度庫(kù),可以與任何其他軟件系統(tǒng)集成,也可以和其他軟件系統(tǒng)一起使用鉴裹。“job scheduler”作業(yè)調(diào)度程序是一個(gè)服務(wù)組件钥弯,負(fù)責(zé)執(zhí)行(或通知)其他軟件組件預(yù)定(預(yù)定)時(shí)間到達(dá)径荔。
Quartz非常靈活,并且包含多個(gè)可以單獨(dú)使用或一起使用的使用范例脆霎,以便實(shí)現(xiàn)所需的行為总处,并使我們能夠以對(duì)項(xiàng)目最為“自然”的方式編寫(xiě)代碼。
Quartz非常輕量級(jí)睛蛛,而且只需要很少的設(shè)置/配置 - 如果您的需求相對(duì)比較基本的話(huà)鹦马,它實(shí)際上可以用于“開(kāi)箱即用”的。
Quartz是容錯(cuò)的忆肾,可以在系統(tǒng)重啟之間持續(xù)('記住')你的預(yù)定作業(yè)荸频。
2.知識(shí)剖析
Quartz體系結(jié)構(gòu)
Job: 是一個(gè)接口,只定義一個(gè)方法execute(JobExecutionContext context)客冈,在實(shí)現(xiàn)接口的execute方法中編寫(xiě)所需要定時(shí)執(zhí)行的Job(任務(wù))旭从, JobExecutionContext類(lèi)提供了調(diào)度應(yīng)用的一些信息。
Job運(yùn)行時(shí)的信息保存在JobDataMap實(shí)例中场仲;
JobDetail: Quartz每次調(diào)度Job時(shí)和悦, 都重新創(chuàng)建一個(gè)Job實(shí)例, 所以它不直接接受一個(gè)Job的實(shí)例燎窘,相反它接收一個(gè)Job實(shí)現(xiàn)類(lèi)(JobDetail:描述Job的實(shí)現(xiàn)類(lèi)及其它相關(guān)的靜態(tài)信息摹闽,如Job名字、描述褐健、關(guān)聯(lián)監(jiān)聽(tīng)器等信息),
以便運(yùn)行時(shí)通過(guò)newInstance()的反射機(jī)制實(shí)例化Job
Trigger:是一個(gè)類(lèi),描述觸發(fā)Job執(zhí)行的時(shí)間觸發(fā)規(guī)則蚜迅。主要有SimpleTrigger和CronTrigger這兩個(gè)子類(lèi)舵匾。
當(dāng)且僅當(dāng)需調(diào)度一次或者以固定時(shí)間間隔周期執(zhí)行調(diào)度,SimpleTrigger是最適合的選擇谁不;而CronTrigger則可以通過(guò)Cron表達(dá)式定義出各種復(fù)雜時(shí)間規(guī)則的調(diào)度方案:
Calendar:org.quartz.Calendar和java.util.Calendar不同坐梯, 它是一些日歷特定時(shí)間點(diǎn)的集合(可以簡(jiǎn)單地將org.quartz.Calendar看作java.util.Calendar的集合——java.util.Calendar代表一個(gè)日歷時(shí)間點(diǎn),無(wú)特殊說(shuō)明后面的Calendar即指org.quartz.Calendar)刹帕。
一個(gè)Trigger可以和多個(gè)Calendar關(guān)聯(lián)吵血, 以便排除或包含某些時(shí)間點(diǎn)
Scheduler:代表一個(gè)Quartz的獨(dú)立運(yùn)行容器, Trigger和JobDetail可以注冊(cè)到Scheduler中偷溺,擁有各自的組及名稱(chēng)蹋辅,組及名稱(chēng)必須唯一(但可以和Trigger的組和名稱(chēng)相同,因?yàn)樗鼈兪遣煌?lèi)型的)挫掏。Scheduler定義了多個(gè)接口方法侦另, 允許外部通過(guò)組及名稱(chēng)訪(fǎng)問(wèn)和控制容器中Trigger和JobDetail。
Scheduler可以將Trigger綁定到某一JobDetail中尉共, 這樣當(dāng)Trigger觸發(fā)時(shí)褒傅,對(duì)應(yīng)的Job就被執(zhí)行。一個(gè)Job可以對(duì)應(yīng)多個(gè)Trigger袄友, 但一個(gè)Trigger只能對(duì)應(yīng)一個(gè)Job殿托。可以通過(guò)SchedulerFactory創(chuàng)建一個(gè)Scheduler實(shí)例剧蚣。Scheduler擁有一個(gè)SchedulerContext支竹,它類(lèi)似于ServletContext,保存著Scheduler上下文信息券敌,Job和Trigger都可以訪(fǎng)問(wèn)SchedulerContext內(nèi)的信息唾戚。SchedulerContext內(nèi)部通過(guò)一個(gè)Map以鍵值對(duì)的方式維護(hù)這些上下文數(shù)據(jù),SchedulerContext為保存和獲取數(shù)據(jù)提供了多個(gè)put()和getXxx()的方法待诅。
3.常見(jiàn)問(wèn)題
quartz和timer的區(qū)別.
4.解決方案
5.編碼實(shí)戰(zhàn)
6.擴(kuò)展思考
為什么不使用java.util.Timer
從JDK 1.3起叹坦,Java通過(guò)java.util.Timer和java.util.TimerTask類(lèi)具有“內(nèi)置”定時(shí)器功能
定時(shí)器沒(méi)有持久性機(jī)制。
定時(shí)器有不靈活的調(diào)度(只能設(shè)置開(kāi)始時(shí)間和重復(fù)間隔卑雁,沒(méi)有基于日期募书,一天中的時(shí)間等)
定時(shí)器不使用線(xiàn)程池(每個(gè)定時(shí)器一個(gè)線(xiàn)程)
定時(shí)器沒(méi)有真正的管理方案 - 你必須編寫(xiě)自己的機(jī)制來(lái)記住,組織和檢索你的任務(wù)名稱(chēng)等测蹲。
7.參考文獻(xiàn)
http://www.quartz-scheduler.org/documentation/faq.html#FAQ-whatQuartz
http://blog.csdn.net/gongyouong/article/details/72965451
謝謝觀看
今天的分享就到這里啦莹捡,歡迎大家點(diǎn)贊、轉(zhuǎn)發(fā)扣甲、留言篮赢、拍磚~
技能樹(shù).IT修真院
“我們相信人人都可以成為一個(gè)工程師齿椅,現(xiàn)在開(kāi)始,找個(gè)師兄启泣,帶你入門(mén)涣脚,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷昧让#”遣蚀。
這里是技能樹(shù).IT修真院,成千上萬(wàn)的師兄在這里找到了自己的學(xué)習(xí)路線(xiàn)纱耻,學(xué)習(xí)透明化芭梯,成長(zhǎng)可見(jiàn)化,師兄1對(duì)1免費(fèi)指導(dǎo)弄喘【链快來(lái)與我一起學(xué)習(xí)吧~