胡茂集
摘 要:本文在闡述quartz解釋、技術(shù)要素和優(yōu)勢的基礎(chǔ)上,探索在J2EE架構(gòu)下使用quartz技術(shù)實現(xiàn)企業(yè)任務(wù)調(diào)度平臺的途徑。
關(guān)鍵詞:quartz;企業(yè)任務(wù)調(diào)度平臺
1 前言
隨著大數(shù)據(jù)時代的來臨以及商業(yè)應(yīng)用地飛速發(fā)展,利用java API實現(xiàn)的傳統(tǒng)離散的任務(wù)調(diào)度應(yīng)用已無法滿足企業(yè)在動態(tài)定制、工作效率以及統(tǒng)一、集中管控等方面提出的需求。企業(yè)任務(wù)調(diào)度平臺(Enterprise task scheduling platform,以下稱ETSP)正是在這樣的背景下提出,該平臺充分利用quartz開源框架功能強大,應(yīng)用靈活,易于集成的特點,適應(yīng)企業(yè)任務(wù)多而雜的現(xiàn)狀,將企業(yè)中諸如消息發(fā)送、數(shù)據(jù)備份、挖掘、報表分析、數(shù)據(jù)采集、同步、遷移、加工等一系列任務(wù)集中管控,并讓用戶可根據(jù)需要定制個性化任務(wù)調(diào)度,有效監(jiān)管任務(wù)調(diào)度運行,降低出錯概率,提高運行效率,減輕企業(yè)IT人員的開發(fā)與維護工作。
2 Quartz任務(wù)調(diào)度的基本實現(xiàn)原理
傳統(tǒng)離散的企業(yè)任務(wù)調(diào)度或使用Java SDK Timer和 TimerTask類,或使用Crontab+SQL來達到目的,這類任務(wù)調(diào)度使配置和代碼分散在多處,難以維護和監(jiān)控,執(zhí)行過程沒有保證,缺失錯誤恢復(fù),在一些步驟復(fù)雜、分散,任務(wù)量大的情況下,很難進行擴展。這些局限恰恰是Quartz的優(yōu)勢。
Quartz完全基于Java實現(xiàn)。它有強大的調(diào)度功能,支持豐富多樣的調(diào)度方法,并具有以下特點:具有強大容錯及負載均衡能力,能被集成到任何獨立的應(yīng)用中,可在servlet容器或應(yīng)用服務(wù)器中實例化,甚至成為獨立程序為集群;程序員可通過RMI運用Quartz。
Quartz的核心三要素是trigger、job和scheduler,其中scheduler為執(zhí)行調(diào)度的實際控制器,trigger、job是任務(wù)調(diào)度的元數(shù)據(jù)。trigger用于定義調(diào)度規(guī)則,即按照什么時間或周期去執(zhí)行任務(wù)。一個job可被多個trigger關(guān)聯(lián),但是一個trigger只能關(guān)聯(lián)一個job。Scheduler定義了很多接口和方法,它表示一個Quartz獨立的運行容器,Trigger和JobDetail可以在Scheduler中被注冊,并許可外程序部通過組及名稱訪問、控制容器中Trigger和JobDetail。
Quartz擁有完備的事件和事件監(jiān)聽體系,大部分組件都擁有觸發(fā)后事件、調(diào)度器開始事件、關(guān)閉事件任務(wù)執(zhí)行前事件、任務(wù)執(zhí)行后事件、觸發(fā)器觸發(fā)前事件等等。
3 企業(yè)任務(wù)調(diào)度平臺的設(shè)計與實現(xiàn)
3.1 平臺功能設(shè)計
根據(jù)Quartz特性,企業(yè)任務(wù)調(diào)度系統(tǒng)包括這些模塊:控制臺、任務(wù)調(diào)度、工作管理、運行規(guī)則管理等,用戶使用企業(yè)任務(wù)調(diào)度平臺管控所有需要調(diào)度的任務(wù),結(jié)合上文提到的scheduler與job的關(guān)聯(lián)來理清任務(wù)與工作之間的關(guān)系,其中,一個任務(wù)包含N個工作,需要通過系統(tǒng)界面將N個工作進行工作編排,每個任務(wù)都基于一條運行規(guī)則按照工作編排的順序執(zhí)行。所以,要新建一個調(diào)度任務(wù),必須經(jīng)過以下步驟:
首先,在運行規(guī)則管理模塊編排運行規(guī)則。經(jīng)過規(guī)則測試成功之后再生成一條新的運行規(guī)則,如用戶確定運行規(guī)則為“每1個月的第10個工作日,在0時0分0秒執(zhí)行”,則規(guī)則編排器自動生成Quartz cron表達式“0 0 0 10W 1/1 ?”。用戶可以選擇該運行規(guī)則基于普通日歷還是工作日歷生成,如果基于工作日歷生成,則在之后的調(diào)度任務(wù)配置功能里可以設(shè)置遇到企業(yè)非工作日或者假期是否順延。工作日歷的管理功能在工作管理模塊中。
其次,在工作管理模塊新建任務(wù)所需要執(zhí)行的各項工作。每項工作生成一條新的工作項。這些工作項可以是企業(yè)其他系統(tǒng)提供的接口,也可以是一些用于數(shù)據(jù)處理的存儲過程或者是用于數(shù)據(jù)加工的ETL(Extract-Transform-Load)工具提供的工作流。新建工作項時,需要配置該工作所屬的工作組,工作組的概念是為了更好的管理各項工作,理清該工作屬性,可以按照用途、類別或者系統(tǒng)界限區(qū)分,比如所有涉及存儲過程的工作項歸為一類、系統(tǒng)接口歸為一類,或者涉及數(shù)據(jù)庫處理的歸為一類、程序執(zhí)行歸為另一類等。
最后,利用已新建的運行規(guī)則及所需工作項,可以選擇N個工作項來編排一個調(diào)度任務(wù),并設(shè)置該任務(wù)的出錯處理、節(jié)假日處理等事項。
3.2 平臺實現(xiàn)
對于一些復(fù)雜的企業(yè)級任務(wù)調(diào)度應(yīng)用來說,建議在程序的開發(fā)階段將整個Quartz的源代碼復(fù)制至開發(fā)環(huán)境中。一方面可以通過修改或擴展Quartz一部分類來實現(xiàn)某些更為復(fù)雜的、Quartz本身尚不提供的接口功能;另一方面,通過閱讀源碼,我們可以迅速了解Quartz的實現(xiàn)原理,更加熟悉接下來的開發(fā)過程。下面我們通過創(chuàng)建數(shù)據(jù)關(guān)系與整合Quartz的方法來概述平臺的實現(xiàn)邏輯。
Quartz依賴于一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(RDMS)來持久化存儲。本平臺使用JDBC來持久化Scheduler狀態(tài)到數(shù)據(jù)庫中。為了實現(xiàn)任務(wù)調(diào)度管控功能,在本平臺中,首先引入Quartz數(shù)據(jù)庫結(jié)構(gòu)建立數(shù)據(jù)庫。
在Quartz中,任務(wù)本身實際的運行時間和耗費在每個監(jiān)聽器上的時間都會直接記入到任務(wù)的執(zhí)行時間上,使用大量的監(jiān)聽器,如JobListeners、SchedulerListeners或TriggerListeners會影響Quartz執(zhí)行效率。再者,Quartz在與數(shù)據(jù)庫交互方面本身實際上只做很少的處理,差不多所有的時間都花費在數(shù)據(jù)庫上,因為基于JDBC的JobStore的速度很大程度上取決于對數(shù)據(jù)庫連接的速度。所以,在本平臺實施過程中,為提高平臺性能,一是為Quartz表建立索引;二是避免創(chuàng)建大量全局監(jiān)聽器。
接下來,我們需要在項目中整合Quartz,具體做法為:將quartz.properties文件放置到classes目錄下即可。至此,Quartz已經(jīng)完整合到了企業(yè)任務(wù)調(diào)度平臺項目中,并建立了任務(wù)調(diào)度數(shù)據(jù)庫。接下來,我們需要利用Quartz框架的重要組件來實現(xiàn)任務(wù)調(diào)度功能,這些組件包括Trigger、Scheduler、Job、JobDetail,以及SchedulerContext和JobDataMap等,限于篇幅,我們不再一一累述。Quartz框架的jar包中有名為examples的文件夾,其中有很多個基礎(chǔ)實例可供開發(fā)者參照。
4 結(jié)語
企業(yè)的調(diào)度任務(wù)規(guī)模越大、越復(fù)雜、越被頻繁地執(zhí)行,那么能從信息化、自動化中獲益也越大。通過本文對Quartz特性、企業(yè)任務(wù)調(diào)度平臺設(shè)計與實現(xiàn)的闡述,我們可以看出,更高的資源使用效率、伸縮性,更少的出錯幾率使得利用Quartz來實現(xiàn)企業(yè)任務(wù)調(diào)度平臺是不二選擇。
參考文獻
[1]耿勇,薛勝軍.J2EE應(yīng)用中任務(wù)的動態(tài)調(diào)度[J].開發(fā)研究與設(shè)計技術(shù),2007,(6):1589-1674.
[2]王崟,董志勇.基于Quartz的網(wǎng)管系統(tǒng)任務(wù)調(diào)度的實現(xiàn)[J].電腦開發(fā)與應(yīng)用,2011,24(7):23-24.
(作者單位:同濟大學(xué)軟件學(xué)院)