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)目最為“自然”的方式編寫代碼票从。
Quartz非常輕量級(jí),而且只需要很少的設(shè)置/配置 - 如果您的需求相對(duì)比較基本的話滨嘱,它實(shí)際上可以用于“開箱即用”的峰鄙。
Quartz是容錯(cuò)的,可以在系統(tǒng)重啟之間持續(xù)('記住')你的預(yù)定作業(yè)太雨。
2.知識(shí)剖析
Quartz體系結(jié)構(gòu)
Job: 是一個(gè)接口先馆,只定義一個(gè)方法execute(JobExecutionContext context),在實(shí)現(xiàn)接口的execute方法中編寫所需要定時(shí)執(zhí)行的Job(任務(wù))躺彬, JobExecutionContext類提供了調(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)類(JobDetail:描述Job的實(shí)現(xiàn)類及其它相關(guān)的靜態(tài)信息,如Job名字脚作、描述葫哗、關(guān)聯(lián)監(jiān)聽器等信息),
以便運(yùn)行時(shí)通過(guò)newInstance()的反射機(jī)制實(shí)例化Job
Trigger:是一個(gè)類球涛,描述觸發(fā)Job執(zhí)行的時(shí)間觸發(fā)規(guī)則劣针。主要有SimpleTrigger和CronTrigger這兩個(gè)子類。
當(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中擎浴,擁有各自的組及名稱,組及名稱必須唯一(但可以和Trigger的組和名稱相同毒涧,因?yàn)樗鼈兪遣煌愋偷模┲ぁcheduler定義了多個(gè)接口方法, 允許外部通過(guò)組及名稱訪問(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,它類似于ServletContext枣申,保存著Scheduler上下文信息售葡,Job和Trigger都可以訪問(wèn)SchedulerContext內(nèi)的信息。SchedulerContext內(nèi)部通過(guò)一個(gè)Map以鍵值對(duì)的方式維護(hù)這些上下文數(shù)據(jù)忠藤,SchedulerContext為保存和獲取數(shù)據(jù)提供了多個(gè)put()和getXxx()的方法挟伙。
3.常見問(wèn)題
quartz與公司框架結(jié)合遇到的問(wèn)題
4.解決方案
我們直接看視頻
5.編碼實(shí)戰(zhàn)
6.擴(kuò)展思考
為什么要把quartz與spring結(jié)合起來(lái)
7.參考文獻(xiàn)
http://chuhanzhi.com/?p=45
第一個(gè)問(wèn)題: 普通類調(diào)用spring里面bean的話自身也需要加入spring管理
如果想用@autowired,那么這個(gè)類本身也應(yīng)該是在spring的管理下 的模孩,即你的Util也要標(biāo)注為一個(gè)component(或Service)尖阔,這樣spring才知道要注入依賴贮缅;
如果不標(biāo)注為@Component的話,此時(shí)不能通過(guò)@autowired來(lái)注入依賴介却,只能通過(guò)ApplicationContext來(lái)取得標(biāo)注為Service的類.
第二個(gè)問(wèn)題:@service 和@Compent的區(qū)別...目前區(qū)分兩者的使用場(chǎng)景還不是特別明確,.按照今天出現(xiàn)問(wèn)題來(lái)講,調(diào)用service的類需要加上@Controlle或@Component注解,,不是controller層要加上@component注解
@Service用于標(biāo)注業(yè)務(wù)層組件
@Controller用于標(biāo)注控制層組件(如struts中的action)
@Repository用于標(biāo)注數(shù)據(jù)訪問(wèn)組件谴供,即DAO組件
@Component泛指組件,當(dāng)組件不好歸類的時(shí)候齿坷,我們可以使用這個(gè)注解進(jìn)行標(biāo)注桂肌。
第三個(gè)問(wèn)題:如果在rmi里面反射service方法時(shí)反射client里面的接口. 因?yàn)閟ervice接口無(wú)法實(shí)例化.會(huì)導(dǎo)致方法為空
第四個(gè)問(wèn)題: test測(cè)試類無(wú)法加載多個(gè)xml文件.
第五個(gè)問(wèn)題:通過(guò)反射調(diào)用client實(shí)現(xiàn)service里面的方法時(shí),無(wú)法加載client里面構(gòu)造的serviceBean.最后通過(guò)在一個(gè)反射里面添加第二個(gè)反射任務(wù)(使用applicationContext的getBean方法加載xml文件里面的bean獲取).
第六個(gè)問(wèn)題: 反射中g(shù)etdeclaredmethod與 getmethod區(qū)別
public Method[] getMethods()返回某個(gè)類的所有公用(public)方法包括其繼承類的公用方法,當(dāng)然也包括它所實(shí)現(xiàn)接口的方法永淌。
public Method[] getDeclaredMethods()對(duì)象表示的類或接口聲明的所有方法崎场,包括公共、保護(hù)遂蛀、默認(rèn)(包)訪問(wèn)和私有方法谭跨,但不包括繼承的方法。當(dāng)然也包括它所實(shí)現(xiàn)接口的方法答恶。
PPT
謝謝觀看
今天的分享就到這里啦饺蚊,歡迎大家點(diǎn)贊萍诱、轉(zhuǎn)發(fā)悬嗓、留言、拍磚~
技能樹.IT修真院
“我們相信人人都可以成為一個(gè)工程師裕坊,現(xiàn)在開始包竹,找個(gè)師兄,帶你入門籍凝,掌控自己學(xué)習(xí)的節(jié)奏周瞎,學(xué)習(xí)的路上不再迷茫”饵蒂。
這里是技能樹.IT修真院声诸,成千上萬(wàn)的師兄在這里找到了自己的學(xué)習(xí)路線,學(xué)習(xí)透明化退盯,成長(zhǎng)可見化彼乌,師兄1對(duì)1免費(fèi)指導(dǎo)≡ㄇǎ快來(lái)與我一起學(xué)習(xí)吧~