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