葉剛


摘要
Quartz的可視化定時任務管理方案介紹了如何直觀、有效地管理諸多的定時任務。該方案高效管理著全部任務的執行狀態,直觀地在頁面顯示著他們的運行結果;任務調度失敗時,可以及時調出日志查明異常原因;同時在具有大量并發執行定時任務的應用系統中效率會大幅提升。
【關鍵詞】可視化 Quartz 定時任務
1 引言
定時任務指在特定的時間點(如:每天23:59:59),特定的時間段(如:每周一12:00-13:00),自行執行的任務。伴隨著客戶的需求,軟件系統中會出現諸如此類的場景如:定期清理日志數據,定時發送消息,定時更新與備份數據,定期統計數據等等,它的出現解決了諸多上述類型的問題。如果它僅僅靠后臺處理執行,我們無法直觀地知道它的運行的狀態即是否執行,運行結果即是否成功以及運行異常。針對此種情況,Quartz的可視化定時任務管理方案可以幫助我們高效的管理定時任務。
2 Quartz概述
Quartz是一個使特定的功能在給定的時間點或時間范圍自行執行的框架,即任務調度的框架,他有三個重要要素:
(1)調度任的調度器Scheduler,所有的任務執行與否都由其控制;
(2)控制任務什么時候被調度器觸發的觸發器Trigger,觸發器可以設置任務才特定的時間或者時間段觸發與任務是否并發執行等;
(3)設置任務執行方法、任務標識等作業屬性的JobDetail。
3 定時任務管理方案設計
在基于Quartz的可視化定時任務管理方案設計時,為了給予定時任務更高效、更直觀的管理方式,同時也為了對給每個任務的運行狀況的全面追蹤,故而此方案針對可視化以及定時任務的調度進行了以下的設計:
3.1 可視化設計
可視化化設計是對所有任務進行界面化的管理,針對每項定時任務的各項屬性,如任務的標識、名稱、執行狀態、調度表達式、任務數據路徑(類完整路徑)、任務執行方法以及是否并發執行等以一條完整記錄形式存入數據庫中。至此,一個個任務轉化成關系表中的一條條記錄,定時任務的可視化管理轉變為常見的關系表的可視化管理。
3.2 定時任務調度設計
可視化設計僅僅是管理任務并未涉及到任務的調度,定時任務調度的設計也是重要的一環,因此Quartz框架在此中必不可少。結合可視化的管理以及任務在被調度器調度時的運行狀態,對定時任務的執行過程做出以下設計:
由圖1可知定時任務的調度不僅僅是服務啟動時任務調度開始啟動,對于每個任務都包括啟動、執行、暫停以及終止,通過狀態轉變以達到與可視化設計融合。
4 定時任務管理方案實現
4.1 可視化實現
(1)基于可視化設計,對定時任務表結構進行如下設計:
CREATE TABLE 'elt_job'(
'id'char(36)NOT NULL COMMENT'任務標識',
'name'varchar(100)NOT NULLCOMMENT'任務隊列標識名稱,取主鍵',
'group'varchar(100)NOT NULLCOMMENT'所屬群組',
'status'varchar(10)NOT NULL DEFAULT'0' COMMENT'任務狀態(運行中,暫停,終止)',
'exp'varchar(100)NOT NULLCOMMENT'調度表達式',
'mark'varchar(255)DEFAULT NULLCOMMENT'備注',
'bean'varchar(255)DEFAULT NULLCOMMENT'任務對象(包+類名)',
'is_con'bit(1)NOT NULL DEFAULT b'1'COMMENT'是否并發執行',
'method_name'varchar(100)NOT NULLCOMMENT'任務執行方法',
'create_time'datetime DEFAULT NULLCOMMENT'創建時間',
'title'varchar(60)DEFAULT NULLCOMMENT'任務簡述/名稱',
PRIMARY KEY('id'),
UNIQUE KEY'group'('name','group')USING BTREE
)ENGINE=InnoDB DEFAULTCFIARSET=utf8;
(2)②結合定時任務調的設計,頁面設計如下:
由圖2可知,通過基于Quartz的定時任務調度可視化界面實現,能夠為用戶提供更直觀的定時任務執行結果展示,進而為定時任務執行狀態以及異常原因提供更直觀的數據依據。
4.2 定時任務調度實現
任務調度是通過Quartz框架實現的,其中整個調度分為以下三步:
(1)根據需求創建需要定時執行任務的方法;
(2)將上述的各個方法對應按照規則存于定時任務表中;
(3)獲取任務方法,即獲取定時任務表數據,結合Quartz框架將任務注冊于調度器,調度器控制定時任務運行狀態的主要代碼如下:
//獲取定時任務表中的記錄
ListeltJob List=eltJobMapper.selectByExample(new Criteria);
//獲取調度器Scheduler
Scheduler s=schedulerFactoryBean.getScheduler();
//根據任務中的名稱和任務組設置規則TriggerKey:
TriggerKey triggerKey=TriggerKey.triggerKey(eltJob.getName(),eltJob.getGroupo);
//組裝調度規則
CronTrigger trigger=(CronTrigger)scheduler.getTrigger(triggerKey);
//任務同步執行還是異步執行
Class cls=E1tJob.CONCURRENT IS.equals(concurrentld)?JobFactory.class:JobFactoryDisallowConcurrentExecution.class;
//通過class獲取job對象創建JobDetail實例
JobDetail detail=JobBuilder.newJob(cls).withIdentity(eltJob.getName(),eltJob.getGroup()).builds;
detail.getJobDataMap().put("job",eltJob);
//獲取調度表達式
CronScheduleBuilderscheduleBuilder=CronScheduleBuilder.cronSchedule(eltJob.getExp());
//創建調度觸發器trigger
trigger=TriggerBuilder.newTrigger().withIdentity(eltJob.getName(),eltJob.getGroup()).withSchedule(scheduleBuilder).build();
//在調度器上注冊Job及觸發器此時調度任務
s.scheduleJob(detail,trigger);
//啟動任務
s.start();
//根據任務名稱和任務組獲取JobKey:
JobKey key=JobKey.jobKey(eltJob.getName(),eltJob.getGroup());
//暫停任務
s.pauseJob(key);
//恢復任務
s.resumeJob(key);
//刪除任務
s.deleteJob(key);
(4)PostConstruct注解修飾的方法在項目啟動時執行且僅執行一次,由于項目啟動時伴隨定時指定定時任務被調用,需要增加一個由次注解修飾的啟動任務的方法,而此方法中考慮到部分定時任務不需隨項目啟動而被調度,會只調用定時任務表狀態staus=1(即為運行中)的任務。
5 總結
基于Quartz可視化定時任務管理不僅可以通過頁面直觀地展示各個任務運行狀態,而且上次任務失敗原因也會被捕獲進而在頁面上展示,方便了開發者或者運維人員及時地發現任務調度中存在的問題,以便快速的解決問題。另外,存在于項目中定時任務方法,沒有通過數據庫進行管理的任務數據,后期入庫后亦可在頁面上啟動此類任務,此做法大幅度的節約了系統資源。存在大量并發方式調度定時任務的項目中,在Quartz框架中設置該類任務為并發執行任務,會大大提高定時任務的執行效率,解決系統需要經常性進行的維護工作。
參考文獻
[1]劉光明,朱肖穎.Web應用與Quartz的整合研究[J].企業科技與發展,2018(03).
[2]符宇航,鄭宗良,曾莉.基于Web的科研項目管理系統的設計與實現[J].電腦知識與技術,2016(27).
[3]許艷丹.基于Quartz.NET框架的任務調度平臺研究與設計[J].軟件導刊,2016(02).
[4]劉增杰,MySQL 5.7 從入門到精通[M].清華大學出版社,2016.