




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
-07-05DocumentRef: Hap框架定時調度器入門Version: 1.0
文檔控制更改記錄日期作者版本更改參考2016-07-031.0無前版本
內容目錄文檔控制 2更改記錄 2內容目錄 3一、 基本概念 41. Quartz的基本認知 42. QuartzJob接口概述 43. Quartz中的Schedule,Trigger,JobDetail 5二、 HelloWorld實例 11三、 總結 161. 任務狀態 162. 觸發器 163. Quartz表 16四、 常見問題 181. 任務觸發 182.存在同一個Job被多個Trigger觸發的情況 18問題統計 19未結問題 19已結問題 19基本概念Quartz的基本認知Quartz是一個完全由Java編寫的開源作業調度框架,為在Java應用程序中進行作業調度提供了簡單卻強大的機制。Quartz允許開發人員根據時間間隔來調度作業。它實現了作業和觸發器的多對多的關系,還能把多個作業與不同的觸發器關聯。Quartz框架包含了調度器監聽、作業和觸發器監聽。你可以配置作業和觸發器監聽為全局監聽或者是特定于作業和觸發器的監聽。QuartzJob接口概述org.quartz.Job接口Quartz雖然整合了很多額外的功能,但就其本質的作業調度功能來看,使用起來相當的便捷,只需簡單的創建一個實現org.quartz.Job接口的Java類。Job接口包含的唯一方法:publicvoidexecute(JobExecutionContextcontext)throwsJobExecutionException;在你的Job接口實現類里面,添加一些邏輯到execute()方法。一旦你配置好Job實現類并設定好調度時間表,Quartz將密切注意剩余時間。當調度程序確定該是通知你的作業的時候,Quartz框架將調用你Job實現類(作業類)上的execute()方法并允許做它該做的事情。無需報告任何東西給調度器或調用任何特定的東西。僅僅執行任務和結束任務即可。如果配置你的作業在隨后再次被調用,Quartz框架將在恰當的時間再次調用它。com.hand.hap.job.AbstractJob抽象類但是execute()方法有一個缺點,就是它在運行時是無法拋出異常的,一旦進行了異常的拋出,當前Job就會自動被停止,那么為了獲取更為詳細的運行時的相關信息,Hap框架對Job接口進行了一次封裝,封裝了一個AbstractJob的抽象類來實現Job接口:publicabstractclassAbstractJobimplementsJob在該類中,我們自定義了一個safeExecute(JobExecutionContextcontext)ThrowsException方法,并讓該方法默認在execute()方法中被調用,這樣我們就能達到在Job出錯時拋出異常的目的了,綜上所述,我們想在Hap框架中定義一個我們自己的Job,我們只需要新建一個繼承了AbstractJob的類就可以了,在safeExecute()方法中加上我們的一些邏輯,這個Job就會自動的根據自定義的規則(Trigger)被掛起。(Ps:該方法里的JobExecutionContextcontext參數會在后面做出解釋。)Quartz中的Schedule,Trigger,JobDetail這里著重給代價介紹一下Quartz中幾個重要的對象,JobDetail(具體可執行的調度程序),Trigger(調度參數的配置),Schedule(調度容器)。這三個對象,是實現Quartz的任務調度必不可少的。JobDetailJobDetail代表了一個具體的、可被執行的任務,即實現了Job接口。下面,我將詳細給大家介紹一下JobDetail具體代表什么,以及在Hap框架中如何創建一個JobDetail。JobDetailJobDetai就是一個具體的可執行任務,我們在這要弄清楚它和Job的區別,Job只是為我們提供了一個會自動去調用的execute()方法,我們在這個方法里填充我們的邏輯。而JobDetail則是一個完整的任務對象,這個對象里除了告訴我們該去調用哪一個Job類去實現什么方法,還包含了調用這個Job的相關信息,例如Job的分組,Job的名字等等……這張圖就代表創建一個簡單的JobDetail對象。JobCreateDto與JobDetailJobCreateDto是Hap框架中自定義的一個簡單的接收Job相關信息的Dto類,我們通過這個Dto類來接受頁面上傳回來的相關屬性,例如這個Job的方法組、方法名、具體調用哪一個Job類以及相關的策略信息。通過這個JobCreateDto,我們可以接收到頁面上的值,然后我們就可以根據這些值來生成JobDetail和Trigger以及Schedule。沒錯,我們雖然是生成了一個JobCreateDto,但是我們的調度器是不認識這個Dto的,我們需要借助JobBuilder來把JobCreateDto轉化成調度器認識的JobDetail。經過這樣的轉化之后,我們就完成了我們調度器需要的JobDetail的生成。TriggerTrigger代表的是調度Job是遵循的策略(觸發器),比如什么時候將這個任務掛起,什么時候停止這個任務。一個Trigger對應一個Job,但是一個Job卻可以有多個Trigger來進行管理,與JobDetail一樣,我們需要通過JobCreateDto里面接收到的屬性來生成相應的Trigger,這次我們使用的方法是TriggerBuilder。這里我們可以重點關注一下我紅框中所標注的方法,一個Trigger就是通過這個.forJob()方法來表示這個Trigger是與哪一個JobDetail相匹配的。ScheduleSchedule的意思是容器,顧名思義就是用來存放JobDetail和Trigger的,當兩者在容器中注冊好之后,相匹配的JobDetail和Trigger就形成了一個完整的作業,那么當這個容器啟動之后,里面的作業就會自動的去開始運行了,三者的大體結構類似于:相同的,Schedule也是根據JobCreateDto的相關屬性來生成的。在三者都生成之后,我們調用Schedule的.scheduleJob()方法,將相應的JobDetail和Trigger存入其中完成注冊之后,我們的一個調度程序就完成了。小結總結一下,我們想要完成一個調度程序的創建,我們的步驟是:通過頁面完成JobCreateDto的封裝;根據JobCreateDto的屬性,通過JobBuilder()來生成調度器認識的JobDetail;根據JobCreateDto的屬性,通過TriggerBuilder()來生成調度器認識的Trigger;根據JobCreateDto的屬性,通過ScheduleBuilder()來生成調度器認識的Schedule;使用Schedule.scheduleJob(JobDeatil,Trigger),完成一個完整作業的注冊。Tips:CRON表達式:Quartz有兩種Trigger,一個是SimpleTrigger,另一個就是CronTigger,CronTrigger能夠提供復雜的觸發器表達式的支持。CronTrigger是基于UnixCron守護進程,它是一個調度程序,支持簡單而強大的觸發器語法。上面兩張圖是等價的,只不過下面一張使用的就是CRON表達式,代表的是每分鐘的第零秒就會執行這個方法。Cron表達式舉例:"30****?"每半分鐘觸發任務"3010***?"每小時的10分30秒觸發任務"30101**?"每天1點10分30秒觸發任務"3010120*?"每月20號1點10分30秒觸發任務"301012010?*"每年10月20號1點10分30秒觸發任務"301012010?2011"2011年10月20號1點10分30秒觸發任務"30101?10*2011"2011年10月每天1點10分30秒觸發任務"30101?10SUN2011"2011年10月每周日1點10分30秒觸發任務"15,30,45****?"每15秒,30秒,45秒時觸發任務"15-45****?"15到45秒內,每秒都觸發任務"15/5****?"每分鐘的每15秒開始觸發,每隔5秒觸發一次"15-30/5****?"每分鐘的15秒到30秒之間開始觸發,每隔5秒觸發一次"00/3***?"每小時的第0分0秒開始,每三分鐘觸發一次"01510?*MON-FRI"星期一到星期五的10點15分0秒觸發任務"01510L*?"每個月最后一天的10點15分0秒觸發任務"01510LW*?"每個月最后一個工作日的10點15分0秒觸發任務"01510?*5L"每個月最后一個星期四的10點15分0秒觸發任務"01510?*5#3"每個月第三周的星期四的10點15分0秒觸發任務這里就介紹這么多,有興趣的童鞋可以參考下面鏈接里的相關資料。Tutorial-Lesson6:CronTrigger;Spring-Quartz-cronExpression中問號(?)的解釋HelloWorld實例在上面的講解之后,相信大家對Job的調度有了一定的理解,那么我們就用一個簡單的實例來給大家梳理一下整個流程,加深一下大家的印象。因為Trigger有兩種形式,也就是SimpleTrigger和CronTrigger,而CronTrigger能處理更加復雜的時間表達格式,它的使用范圍更大,所以這里我們以CronTrigger為例:首先,點擊項目頁面上的任務詳情,我們可以看到對Job進行管理的界面,點擊新建Cron任務或簡單任務,我們就可以在彈出窗口上完善我們的Job信息;在Job信息的完善頁面,補充我們需要的相應信息來生成一個完善的JobCreateDto;在上圖我們可以看到我們在新建Cron任務頁面上填寫任務類名,就是對應這里的后臺HelloWorldJob,這個類繼承了我們框架中封裝好的AbstractJob,也就是實現了Job接口,證明這是一個可以被調度的Job類,而這個類的作用也很簡單,就是在控制臺通過logger來打印一句話而已。JobCreateDto生成完成之后,我們就會在后臺進行JobDetail的生成,具體方法可以參見com.hand.hap.job.service.impl中QuzrtzServiceImpl的CreateJob方法:JobDetail和Trigger完成在Schedule中的作業注冊后,JobDetail就會自動根據相應的Trigger來運行;綠色的Job任務代表該任務正在執行中,我們可以在控制臺中看到這個Job的相關信息,上圖中的紅框就是我們Job中打印的一句話。在這需要和大家說明一下,當我們完成一個Job的創建后,這個Job就會馬上被執行一次,之后才會匹配我們定義的Trigger來執行。同時,我們每一個Job的執行,都會有一個監聽器來對這個Job進行監聽,也就是JobRunningListener,感興趣的童鞋可以去研究一下。(ps:當我們在后臺創建完一個線程后,可以在前臺直接將這個Job掛起,不用再次重啟服務。)另外在項目中perties文件定義了Quartz應用運行時行為,還包含了許多能控制Quartz運轉的屬性。它應放在工程的classpath中。童鞋們可以看一看。總結任務狀態Quartz框架中QRTZ_TRIGGERS表TRIGGER_STATE字段顯示任務的屬性大概狀態有這幾種:WAITING:等待PAUSED:暫停ACQUIRED:正常執行BLOCKED:阻塞ERROR:錯誤觸發器Quartz的觸發時間的配置有三種方式:cron的方式:采用cronExpression表達式配置時間;simple的方式,和JavaTimer差不多,可以指定一個開始時間和結束時間外加一個循環時間;calendars方式,可以和cron配合使用,用cron表達式指定一個觸發時間規律,用calendar指定一個范圍。Quartz表Quatrz集群調度模式下涉及到如下的相關表:/*job監聽器*/SELECTT.*,ROWIDFROMQRTZ_JOB_LISTENERST;/*觸發器監聽器*/SELECTT.*,ROWIDFROMQRTZ_TRIGGER_LISTENERST;/*存放暫停掉的觸發器*/SELECTT.*,ROWIDFROMQRTZ_PAUSED_TRIGGER_GRPST;SELECTT.*,ROWIDFROMQRTZ_LOCKST;/*存放日歷信息,quartz可配置一個日歷來指定一個時間范圍*/SELECTT.*,ROWIDFROMQRTZ_CALENDARST;SELECTT.*,ROWIDFROMQRTZ_BLOB_TRIGGERST;/*存放已觸發的觸發器*/SELECTT.*,ROWIDFROMQRTZ_FIRED_TRIGGERST;/*觸發器的基本信息*/SELECTT.*,ROWIDFROMQRTZ_TRIGGERST;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 護士入編面試試題及答案
- 五類人員筆試題及答案
- 激光工程師的專業能力培養與提升試題及答案
- 育嬰師成長陪伴技巧試題及答案
- 2025屆高考化學一輪復習專題一物質的量4含解析新人教版
- 二年級語文上冊第三單元9朱德的扁擔教學反思參考1語文S版
- 企業辦公室試題及答案
- 2024年秋一年級語文上冊課文14四季教學反思1新人教版
- 六年級體育下冊山羊分腿騰越練習無答案
- 教師資格考試的全方位備考試題與答案
- 《神經系統發育》課件
- 2024年中通服網盈科技有限公司招聘筆試參考題庫含答案解析
- 供應鏈安全:知識產權的保護
- 胰島素泵胰島素筆結構設計與材料
- 七年級語文下冊期中試卷含答案【部編版】
- 二手車鑒定評估報告書(范本)
- 運營保密協議
- 人工智能圖像識別與分析工具項目需求分析
- 小學教育教學常規工作精細化管理實施方案
- 安全質量觀摩會策劃報告
- 【小米公司財務共享服務中心的構建與運行探究8200字(論文)】
評論
0/150
提交評論