HAP框架-定時(shí)調(diào)度器使用手冊(cè)_第1頁(yè)
HAP框架-定時(shí)調(diào)度器使用手冊(cè)_第2頁(yè)
HAP框架-定時(shí)調(diào)度器使用手冊(cè)_第3頁(yè)
HAP框架-定時(shí)調(diào)度器使用手冊(cè)_第4頁(yè)
HAP框架-定時(shí)調(diào)度器使用手冊(cè)_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

-07-05DocumentRef: Hap框架定時(shí)調(diào)度器入門(mén)Version: 1.0

文檔控制更改記錄日期作者版本更改參考2016-07-031.0無(wú)前版本

內(nèi)容目錄文檔控制 2更改記錄 2內(nèi)容目錄 3一、 基本概念 41. Quartz的基本認(rèn)知 42. QuartzJob接口概述 43. Quartz中的Schedule,Trigger,JobDetail 5二、 HelloWorld實(shí)例 11三、 總結(jié) 161. 任務(wù)狀態(tài) 162. 觸發(fā)器 163. Quartz表 16四、 常見(jiàn)問(wèn)題 181. 任務(wù)觸發(fā) 182.存在同一個(gè)Job被多個(gè)Trigger觸發(fā)的情況 18問(wèn)題統(tǒng)計(jì) 19未結(jié)問(wèn)題 19已結(jié)問(wèn)題 19基本概念Quartz的基本認(rèn)知Quartz是一個(gè)完全由Java編寫(xiě)的開(kāi)源作業(yè)調(diào)度框架,為在Java應(yīng)用程序中進(jìn)行作業(yè)調(diào)度提供了簡(jiǎn)單卻強(qiáng)大的機(jī)制。Quartz允許開(kāi)發(fā)人員根據(jù)時(shí)間間隔來(lái)調(diào)度作業(yè)。它實(shí)現(xiàn)了作業(yè)和觸發(fā)器的多對(duì)多的關(guān)系,還能把多個(gè)作業(yè)與不同的觸發(fā)器關(guān)聯(lián)。Quartz框架包含了調(diào)度器監(jiān)聽(tīng)、作業(yè)和觸發(fā)器監(jiān)聽(tīng)。你可以配置作業(yè)和觸發(fā)器監(jiān)聽(tīng)為全局監(jiān)聽(tīng)或者是特定于作業(yè)和觸發(fā)器的監(jiān)聽(tīng)。QuartzJob接口概述org.quartz.Job接口Quartz雖然整合了很多額外的功能,但就其本質(zhì)的作業(yè)調(diào)度功能來(lái)看,使用起來(lái)相當(dāng)?shù)谋憬?,只需?jiǎn)單的創(chuàng)建一個(gè)實(shí)現(xiàn)org.quartz.Job接口的Java類。Job接口包含的唯一方法:publicvoidexecute(JobExecutionContextcontext)throwsJobExecutionException;在你的Job接口實(shí)現(xiàn)類里面,添加一些邏輯到execute()方法。一旦你配置好Job實(shí)現(xiàn)類并設(shè)定好調(diào)度時(shí)間表,Quartz將密切注意剩余時(shí)間。當(dāng)調(diào)度程序確定該是通知你的作業(yè)的時(shí)候,Quartz框架將調(diào)用你Job實(shí)現(xiàn)類(作業(yè)類)上的execute()方法并允許做它該做的事情。無(wú)需報(bào)告任何東西給調(diào)度器或調(diào)用任何特定的東西。僅僅執(zhí)行任務(wù)和結(jié)束任務(wù)即可。如果配置你的作業(yè)在隨后再次被調(diào)用,Quartz框架將在恰當(dāng)?shù)臅r(shí)間再次調(diào)用它。com.hand.hap.job.AbstractJob抽象類但是execute()方法有一個(gè)缺點(diǎn),就是它在運(yùn)行時(shí)是無(wú)法拋出異常的,一旦進(jìn)行了異常的拋出,當(dāng)前Job就會(huì)自動(dòng)被停止,那么為了獲取更為詳細(xì)的運(yùn)行時(shí)的相關(guān)信息,Hap框架對(duì)Job接口進(jìn)行了一次封裝,封裝了一個(gè)AbstractJob的抽象類來(lái)實(shí)現(xiàn)Job接口:publicabstractclassAbstractJobimplementsJob在該類中,我們自定義了一個(gè)safeExecute(JobExecutionContextcontext)ThrowsException方法,并讓該方法默認(rèn)在execute()方法中被調(diào)用,這樣我們就能達(dá)到在Job出錯(cuò)時(shí)拋出異常的目的了,綜上所述,我們想在Hap框架中定義一個(gè)我們自己的Job,我們只需要新建一個(gè)繼承了AbstractJob的類就可以了,在safeExecute()方法中加上我們的一些邏輯,這個(gè)Job就會(huì)自動(dòng)的根據(jù)自定義的規(guī)則(Trigger)被掛起。(Ps:該方法里的JobExecutionContextcontext參數(shù)會(huì)在后面做出解釋。)Quartz中的Schedule,Trigger,JobDetail這里著重給代價(jià)介紹一下Quartz中幾個(gè)重要的對(duì)象,JobDetail(具體可執(zhí)行的調(diào)度程序),Trigger(調(diào)度參數(shù)的配置),Schedule(調(diào)度容器)。這三個(gè)對(duì)象,是實(shí)現(xiàn)Quartz的任務(wù)調(diào)度必不可少的。JobDetailJobDetail代表了一個(gè)具體的、可被執(zhí)行的任務(wù),即實(shí)現(xiàn)了Job接口。下面,我將詳細(xì)給大家介紹一下JobDetail具體代表什么,以及在Hap框架中如何創(chuàng)建一個(gè)JobDetail。JobDetailJobDetai就是一個(gè)具體的可執(zhí)行任務(wù),我們?cè)谶@要弄清楚它和Job的區(qū)別,Job只是為我們提供了一個(gè)會(huì)自動(dòng)去調(diào)用的execute()方法,我們?cè)谶@個(gè)方法里填充我們的邏輯。而JobDetail則是一個(gè)完整的任務(wù)對(duì)象,這個(gè)對(duì)象里除了告訴我們?cè)撊フ{(diào)用哪一個(gè)Job類去實(shí)現(xiàn)什么方法,還包含了調(diào)用這個(gè)Job的相關(guān)信息,例如Job的分組,Job的名字等等……這張圖就代表創(chuàng)建一個(gè)簡(jiǎn)單的JobDetail對(duì)象。JobCreateDto與JobDetailJobCreateDto是Hap框架中自定義的一個(gè)簡(jiǎn)單的接收J(rèn)ob相關(guān)信息的Dto類,我們通過(guò)這個(gè)Dto類來(lái)接受頁(yè)面上傳回來(lái)的相關(guān)屬性,例如這個(gè)Job的方法組、方法名、具體調(diào)用哪一個(gè)Job類以及相關(guān)的策略信息。通過(guò)這個(gè)JobCreateDto,我們可以接收到頁(yè)面上的值,然后我們就可以根據(jù)這些值來(lái)生成JobDetail和Trigger以及Schedule。沒(méi)錯(cuò),我們雖然是生成了一個(gè)JobCreateDto,但是我們的調(diào)度器是不認(rèn)識(shí)這個(gè)Dto的,我們需要借助JobBuilder來(lái)把JobCreateDto轉(zhuǎn)化成調(diào)度器認(rèn)識(shí)的JobDetail。經(jīng)過(guò)這樣的轉(zhuǎn)化之后,我們就完成了我們調(diào)度器需要的JobDetail的生成。TriggerTrigger代表的是調(diào)度Job是遵循的策略(觸發(fā)器),比如什么時(shí)候?qū)⑦@個(gè)任務(wù)掛起,什么時(shí)候停止這個(gè)任務(wù)。一個(gè)Trigger對(duì)應(yīng)一個(gè)Job,但是一個(gè)Job卻可以有多個(gè)Trigger來(lái)進(jìn)行管理,與JobDetail一樣,我們需要通過(guò)JobCreateDto里面接收到的屬性來(lái)生成相應(yīng)的Trigger,這次我們使用的方法是TriggerBuilder。這里我們可以重點(diǎn)關(guān)注一下我紅框中所標(biāo)注的方法,一個(gè)Trigger就是通過(guò)這個(gè).forJob()方法來(lái)表示這個(gè)Trigger是與哪一個(gè)JobDetail相匹配的。ScheduleSchedule的意思是容器,顧名思義就是用來(lái)存放JobDetail和Trigger的,當(dāng)兩者在容器中注冊(cè)好之后,相匹配的JobDetail和Trigger就形成了一個(gè)完整的作業(yè),那么當(dāng)這個(gè)容器啟動(dòng)之后,里面的作業(yè)就會(huì)自動(dòng)的去開(kāi)始運(yùn)行了,三者的大體結(jié)構(gòu)類似于:相同的,Schedule也是根據(jù)JobCreateDto的相關(guān)屬性來(lái)生成的。在三者都生成之后,我們調(diào)用Schedule的.scheduleJob()方法,將相應(yīng)的JobDetail和Trigger存入其中完成注冊(cè)之后,我們的一個(gè)調(diào)度程序就完成了。小結(jié)總結(jié)一下,我們想要完成一個(gè)調(diào)度程序的創(chuàng)建,我們的步驟是:通過(guò)頁(yè)面完成JobCreateDto的封裝;根據(jù)JobCreateDto的屬性,通過(guò)JobBuilder()來(lái)生成調(diào)度器認(rèn)識(shí)的JobDetail;根據(jù)JobCreateDto的屬性,通過(guò)TriggerBuilder()來(lái)生成調(diào)度器認(rèn)識(shí)的Trigger;根據(jù)JobCreateDto的屬性,通過(guò)ScheduleBuilder()來(lái)生成調(diào)度器認(rèn)識(shí)的Schedule;使用Schedule.scheduleJob(JobDeatil,Trigger),完成一個(gè)完整作業(yè)的注冊(cè)。Tips:CRON表達(dá)式:Quartz有兩種Trigger,一個(gè)是SimpleTrigger,另一個(gè)就是CronTigger,CronTrigger能夠提供復(fù)雜的觸發(fā)器表達(dá)式的支持。CronTrigger是基于UnixCron守護(hù)進(jìn)程,它是一個(gè)調(diào)度程序,支持簡(jiǎn)單而強(qiáng)大的觸發(fā)器語(yǔ)法。上面兩張圖是等價(jià)的,只不過(guò)下面一張使用的就是CRON表達(dá)式,代表的是每分鐘的第零秒就會(huì)執(zhí)行這個(gè)方法。Cron表達(dá)式舉例:"30****?"每半分鐘觸發(fā)任務(wù)"3010***?"每小時(shí)的10分30秒觸發(fā)任務(wù)"30101**?"每天1點(diǎn)10分30秒觸發(fā)任務(wù)"3010120*?"每月20號(hào)1點(diǎn)10分30秒觸發(fā)任務(wù)"301012010?*"每年10月20號(hào)1點(diǎn)10分30秒觸發(fā)任務(wù)"301012010?2011"2011年10月20號(hào)1點(diǎn)10分30秒觸發(fā)任務(wù)"30101?10*2011"2011年10月每天1點(diǎn)10分30秒觸發(fā)任務(wù)"30101?10SUN2011"2011年10月每周日1點(diǎn)10分30秒觸發(fā)任務(wù)"15,30,45****?"每15秒,30秒,45秒時(shí)觸發(fā)任務(wù)"15-45****?"15到45秒內(nèi),每秒都觸發(fā)任務(wù)"15/5****?"每分鐘的每15秒開(kāi)始觸發(fā),每隔5秒觸發(fā)一次"15-30/5****?"每分鐘的15秒到30秒之間開(kāi)始觸發(fā),每隔5秒觸發(fā)一次"00/3***?"每小時(shí)的第0分0秒開(kāi)始,每三分鐘觸發(fā)一次"01510?*MON-FRI"星期一到星期五的10點(diǎn)15分0秒觸發(fā)任務(wù)"01510L*?"每個(gè)月最后一天的10點(diǎn)15分0秒觸發(fā)任務(wù)"01510LW*?"每個(gè)月最后一個(gè)工作日的10點(diǎn)15分0秒觸發(fā)任務(wù)"01510?*5L"每個(gè)月最后一個(gè)星期四的10點(diǎn)15分0秒觸發(fā)任務(wù)"01510?*5#3"每個(gè)月第三周的星期四的10點(diǎn)15分0秒觸發(fā)任務(wù)這里就介紹這么多,有興趣的童鞋可以參考下面鏈接里的相關(guān)資料。Tutorial-Lesson6:CronTrigger;Spring-Quartz-cronExpression中問(wèn)號(hào)(?)的解釋HelloWorld實(shí)例在上面的講解之后,相信大家對(duì)Job的調(diào)度有了一定的理解,那么我們就用一個(gè)簡(jiǎn)單的實(shí)例來(lái)給大家梳理一下整個(gè)流程,加深一下大家的印象。因?yàn)門(mén)rigger有兩種形式,也就是SimpleTrigger和CronTrigger,而CronTrigger能處理更加復(fù)雜的時(shí)間表達(dá)格式,它的使用范圍更大,所以這里我們以CronTrigger為例:首先,點(diǎn)擊項(xiàng)目頁(yè)面上的任務(wù)詳情,我們可以看到對(duì)Job進(jìn)行管理的界面,點(diǎn)擊新建Cron任務(wù)或簡(jiǎn)單任務(wù),我們就可以在彈出窗口上完善我們的Job信息;在Job信息的完善頁(yè)面,補(bǔ)充我們需要的相應(yīng)信息來(lái)生成一個(gè)完善的JobCreateDto;在上圖我們可以看到我們?cè)谛陆–ron任務(wù)頁(yè)面上填寫(xiě)任務(wù)類名,就是對(duì)應(yīng)這里的后臺(tái)HelloWorldJob,這個(gè)類繼承了我們框架中封裝好的AbstractJob,也就是實(shí)現(xiàn)了Job接口,證明這是一個(gè)可以被調(diào)度的Job類,而這個(gè)類的作用也很簡(jiǎn)單,就是在控制臺(tái)通過(guò)logger來(lái)打印一句話而已。JobCreateDto生成完成之后,我們就會(huì)在后臺(tái)進(jìn)行JobDetail的生成,具體方法可以參見(jiàn)com.hand.hap.job.service.impl中QuzrtzServiceImpl的CreateJob方法:JobDetail和Trigger完成在Schedule中的作業(yè)注冊(cè)后,JobDetail就會(huì)自動(dòng)根據(jù)相應(yīng)的Trigger來(lái)運(yùn)行;綠色的Job任務(wù)代表該任務(wù)正在執(zhí)行中,我們可以在控制臺(tái)中看到這個(gè)Job的相關(guān)信息,上圖中的紅框就是我們Job中打印的一句話。在這需要和大家說(shuō)明一下,當(dāng)我們完成一個(gè)Job的創(chuàng)建后,這個(gè)Job就會(huì)馬上被執(zhí)行一次,之后才會(huì)匹配我們定義的Trigger來(lái)執(zhí)行。同時(shí),我們每一個(gè)Job的執(zhí)行,都會(huì)有一個(gè)監(jiān)聽(tīng)器來(lái)對(duì)這個(gè)Job進(jìn)行監(jiān)聽(tīng),也就是JobRunningListener,感興趣的童鞋可以去研究一下。(ps:當(dāng)我們?cè)诤笈_(tái)創(chuàng)建完一個(gè)線程后,可以在前臺(tái)直接將這個(gè)Job掛起,不用再次重啟服務(wù)。)另外在項(xiàng)目中perties文件定義了Quartz應(yīng)用運(yùn)行時(shí)行為,還包含了許多能控制Quartz運(yùn)轉(zhuǎn)的屬性。它應(yīng)放在工程的classpath中。童鞋們可以看一看。總結(jié)任務(wù)狀態(tài)Quartz框架中QRTZ_TRIGGERS表TRIGGER_STATE字段顯示任務(wù)的屬性大概狀態(tài)有這幾種:WAITING:等待PAUSED:暫停ACQUIRED:正常執(zhí)行BLOCKED:阻塞ERROR:錯(cuò)誤觸發(fā)器Quartz的觸發(fā)時(shí)間的配置有三種方式:cron的方式:采用cronExpression表達(dá)式配置時(shí)間;simple的方式,和JavaTimer差不多,可以指定一個(gè)開(kāi)始時(shí)間和結(jié)束時(shí)間外加一個(gè)循環(huán)時(shí)間;calendars方式,可以和cron配合使用,用cron表達(dá)式指定一個(gè)觸發(fā)時(shí)間規(guī)律,用calendar指定一個(gè)范圍。Quartz表Quatrz集群調(diào)度模式下涉及到如下的相關(guān)表:/*job監(jiān)聽(tīng)器*/SELECTT.*,ROWIDFROMQRTZ_JOB_LISTENERST;/*觸發(fā)器監(jiān)聽(tīng)器*/SELECTT.*,ROWIDFROMQRTZ_TRIGGER_LISTENERST;/*存放暫停掉的觸發(fā)器*/SELECTT.*,ROWIDFROMQRTZ_PAUSED_TRIGGER_GRPST;SELECTT.*,ROWIDFROMQRTZ_LOCKST;/*存放日歷信息,quartz可配置一個(gè)日歷來(lái)指定一個(gè)時(shí)間范圍*/SELECTT.*,ROWIDFROMQRTZ_CALENDARST;SELECTT.*,ROWIDFROMQRTZ_BLOB_TRIGGERST;/*存放已觸發(fā)的觸發(fā)器*/SELECTT.*,ROWIDFROMQRTZ_FIRED_TRIGGERST;/*觸發(fā)器的基本信息*/SELECTT.*,ROWIDFROMQRTZ_TRIGGERST;

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論