摘 要: 集團(tuán)化應(yīng)用系統(tǒng)中定時(shí)任務(wù)需要處理的數(shù)據(jù)量大、任務(wù)數(shù)量多,為即時(shí)快速對所有數(shù)據(jù)進(jìn)行處理,需要將任務(wù)進(jìn)行分布部署運(yùn)行。通過對Quartz調(diào)度框架和集群分布部署技術(shù)的分析和研究,提出了集團(tuán)化應(yīng)用系統(tǒng)任務(wù)調(diào)度基于Quartz的集群分布部署方案,通過將Quartz和Spring集成并對Quartz調(diào)度任務(wù)容器進(jìn)行擴(kuò)展,在MemCache上進(jìn)行服務(wù)器狀態(tài)的更新,解決了大型應(yīng)用系統(tǒng)定時(shí)任務(wù)的分布運(yùn)行、故障處理問題。
關(guān)鍵字: Quartz; 任務(wù)調(diào)度; 集群; 分布部署
中圖分類號(hào): TN911?34; TP393 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 1004?373X(2014)02?0080?04
0 引 言
各類應(yīng)用系統(tǒng)中,都存在著多種類型的定時(shí)調(diào)度任務(wù),自動(dòng)進(jìn)行業(yè)務(wù)和系統(tǒng)功能的處理,如報(bào)表統(tǒng)計(jì)、流程流轉(zhuǎn)、系統(tǒng)消息發(fā)送、系統(tǒng)運(yùn)行監(jiān)控、靜態(tài)文件生成等。目前大型集團(tuán)化企業(yè)應(yīng)用系統(tǒng)在向統(tǒng)一規(guī)劃、統(tǒng)一設(shè)計(jì)、統(tǒng)一開發(fā)、統(tǒng)一部署的大集中式云應(yīng)用方向發(fā)展,通過統(tǒng)一的應(yīng)用系統(tǒng)有利于進(jìn)行集團(tuán)內(nèi)各分公司、下屬單位業(yè)務(wù)的統(tǒng)一,有效利用硬件資源,通過集群提高系統(tǒng)的可靠性。這類應(yīng)用系統(tǒng)中的定時(shí)任務(wù)需處理的數(shù)據(jù)量較大、任務(wù)運(yùn)行時(shí)間長,為了提高數(shù)據(jù)處理的效率,可能需要將同一任務(wù)根據(jù)數(shù)據(jù)來源、類型分成多個(gè)任務(wù)同時(shí)進(jìn)行處理,在單個(gè)服務(wù)器上運(yùn)行大量任務(wù),系統(tǒng)的可靠性不能滿足,需要能將任務(wù)在多個(gè)集群服務(wù)器上進(jìn)行分布部署運(yùn)行。
JDK中的Timer、ScheduledExecutor是Java中實(shí)現(xiàn)定時(shí)調(diào)度任務(wù)的基礎(chǔ)方法,但由于其功能較為簡單,較難實(shí)現(xiàn)復(fù)雜的任務(wù)調(diào)度運(yùn)行規(guī)則,在實(shí)際的應(yīng)用開發(fā)中更多使用開源調(diào)度框架,如Quartz,Cron4j,JCronTab等,其中Quartz與Spring可以方便的集成,功能豐富,使用最為廣泛。但其運(yùn)行規(guī)則配置為代碼級別,集群方式不能進(jìn)行任務(wù)的指定服務(wù)器分布,不便于任務(wù)的運(yùn)行管理,需要對其進(jìn)行擴(kuò)展。
1 Quartz調(diào)度框架
Quartz 是 OpenSymphony 開源組織在任務(wù)調(diào)度領(lǐng)域的一個(gè)開源項(xiàng)目,完全基于 Java 實(shí)現(xiàn)。該項(xiàng)目于 2009 年被 Terracotta 收購,目前是 Terracotta 旗下的一個(gè)項(xiàng)目。Quartz 為在 Java 應(yīng)用程序中進(jìn)行任務(wù)調(diào)度提供了簡單卻強(qiáng)大的機(jī)制,支持從小型獨(dú)立應(yīng)用到大型企業(yè)級系統(tǒng)的各種類型Java應(yīng)用。
1.1 Quartz基本概念
Quartz調(diào)度框架中核心元素包括Schedule,Job和Trigger。
Job用于表示被調(diào)度的任務(wù),是定時(shí)執(zhí)行的實(shí)際業(yè)務(wù)處理過程[2]。Quartz提供一個(gè)單方法的接口支持業(yè)務(wù)任務(wù)的實(shí)現(xiàn)。主要有兩種類型的Job:無狀態(tài)的(Stateless)和有狀態(tài)的(Stateful)。有狀態(tài)的Job不能被并行執(zhí)行,只有上一次觸發(fā)的任務(wù)被執(zhí)行完之后,才能觸發(fā)下一次執(zhí)行。
Trigger是用于定義任務(wù)調(diào)度觸發(fā)條件,即按照什么時(shí)間規(guī)則去執(zhí)行任務(wù)。Quartz中主要提供了四種類型的Trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger和NthIncludedDayTrigger。這四種Trigger可以滿足企業(yè)應(yīng)用中的絕大部分需求,最長用的是CronTrigger,可以通過Cron表達(dá)式進(jìn)行調(diào)度的年、月、日、星期、時(shí)、分、秒及循環(huán)間隔的定義。Job必須關(guān)聯(lián)到Trigger上才能運(yùn)行,一個(gè)Job可以被多個(gè)Trigger關(guān)聯(lián),但是一個(gè)Trigger只能關(guān)聯(lián)一個(gè)Job。
Scheduler任務(wù)調(diào)度器是Quartz的核心,是調(diào)度任務(wù)的容器和管理器,Job和Trigger都需要注冊到Schedule上。Schedule負(fù)責(zé)任務(wù)調(diào)度器的初始化,進(jìn)行任務(wù)的啟動(dòng)、停止及任務(wù)數(shù)據(jù)、事件的管理。
1.2 Quartz與Spring基礎(chǔ)使用介紹
在J2EE系統(tǒng)中,Quartz可以與Spring方便的進(jìn)行集成,Job由Spring統(tǒng)一進(jìn)行關(guān)聯(lián),可以方便地在Job中注入相關(guān)業(yè)務(wù)bean,并由Spring進(jìn)行調(diào)度容器的初始化、加載全部Job和Trigger并啟動(dòng)運(yùn)行[3]。
Quartz和Spring基礎(chǔ)集成使用過程如下:
(1)通過Quartz的Job接口實(shí)現(xiàn)定時(shí)任務(wù)的業(yè)務(wù)功能,可引用Spring已定義的其他bean。
(2)在Spring applicationContext.xml中配置任務(wù)Bean,通過jobDataAsMap屬性為任務(wù)注入業(yè)務(wù)bean,樣例代碼如下:
(3)在Spring applicationContext.xml中配置任務(wù)運(yùn)行的調(diào)度規(guī)則,樣例代碼如下:
//關(guān)聯(lián)定時(shí)任務(wù)bean(4)在Spring applicationContext.xml中配置調(diào)度任務(wù)容器,樣例代碼如下:
按照以上步驟配置后,啟動(dòng)中間件服務(wù)器,Spring會(huì)自動(dòng)加載配置文件中已注冊的任務(wù)進(jìn)行調(diào)度運(yùn)行。根據(jù)以上配置過程可見,要添加、修改任務(wù)運(yùn)行的調(diào)度規(guī)則,必須修改XML配置文件,需要重新啟動(dòng)服務(wù)器才能生效,且不能配置同一任務(wù)在多個(gè)服務(wù)器分布運(yùn)行,不適合實(shí)際應(yīng)用系統(tǒng)的使用,因此需要對Quartz功能進(jìn)行擴(kuò)展,增強(qiáng)其集群分布運(yùn)行能力,提高其可維護(hù)性。
2 集群分布部署
集群技術(shù)(Cluster技術(shù))就是將多臺(tái)服務(wù)器用集群軟件連接在一起,組成一個(gè)高度透明的大型服務(wù)器群的計(jì)算機(jī)系統(tǒng),作為一個(gè)整體為客戶端提供服務(wù),客戶端能共享網(wǎng)絡(luò)上的所有資源,如數(shù)據(jù)或應(yīng)用軟件等,同時(shí)客戶端的用戶并不關(guān)心其應(yīng)用Server運(yùn)行在那臺(tái)服務(wù)器上,只關(guān)心其應(yīng)用Server是否能連續(xù)工作。當(dāng)集群系統(tǒng)內(nèi)某一臺(tái)服務(wù)器出現(xiàn)故障時(shí),其備援服務(wù)器便立即接管該故障服務(wù)器的應(yīng)用服務(wù),繼續(xù)為前端的用戶提供服務(wù)。按照集群的部署情況可分為垂直集群和水平集群,垂直集群是在一臺(tái)服務(wù)器上部署多臺(tái)服務(wù)器,充分利用硬件資源。水平集群是利用多臺(tái)機(jī)器資源,每臺(tái)機(jī)器部署相同的應(yīng)用。采用集群部署的目標(biāo)有:
(1) 提高性能
一些計(jì)算密集型應(yīng)用,需要計(jì)算機(jī)有很強(qiáng)的運(yùn)算處理能力,現(xiàn)有的技術(shù),即使普通的大型機(jī)其計(jì)算也很難勝任[4]。這時(shí),一般都使用計(jì)算機(jī)集群技術(shù),集中幾十臺(tái)甚至上百臺(tái)計(jì)算機(jī)的運(yùn)算能力來滿足要求。提高處理性能一直是集群技術(shù)研究的一個(gè)重要目標(biāo)之一。
(2) 降低成本
通常一套較好的集群配置,其軟硬件開銷要超過100 000美元。但與價(jià)值上百萬美元的專用超級計(jì)算機(jī)相比已屬相當(dāng)便宜。在達(dá)到同樣性能的條件下,采用計(jì)算機(jī)集群比采用同等運(yùn)算能力的大型計(jì)算機(jī)具有更高的性價(jià)比。
(3) 提高可擴(kuò)展性
用戶若想擴(kuò)展系統(tǒng)能力,不得不購買更高性能的服務(wù)器,才能獲得額外所需的CPU 和存儲(chǔ)器[5]。如果采用集群技術(shù),則只需要將新的服務(wù)器加入集群中即可,對于客戶來看,服務(wù)無論從連續(xù)性還是性能上都幾乎沒有變化,好像系統(tǒng)在不知不覺中完成了升級。
(4) 增強(qiáng)可靠性
集群技術(shù)使系統(tǒng)在故障發(fā)生時(shí)仍可以繼續(xù)工作,將系統(tǒng)停運(yùn)時(shí)間減到最小。集群系統(tǒng)在提高系統(tǒng)的可靠性的同時(shí),也大大減小了故障損失。
3 基于Quartz的任務(wù)調(diào)度集群部署
3.1 Quartz擴(kuò)展架構(gòu)
根據(jù)前面的分析,要基于Quartz實(shí)現(xiàn)調(diào)度任務(wù)的集群分布部署,主要是要實(shí)現(xiàn)對任務(wù)調(diào)度規(guī)則Trigger在關(guān)系型數(shù)據(jù)庫中的配置,及調(diào)度管理器的擴(kuò)展,將定時(shí)任務(wù)根據(jù)配置分配到多個(gè)服務(wù)器上運(yùn)行[6]。同時(shí)對Quartz的任務(wù)接口進(jìn)行擴(kuò)展,增強(qiáng)Job通用功能,實(shí)現(xiàn)調(diào)度器運(yùn)行狀態(tài)監(jiān)測、調(diào)度故障轉(zhuǎn)移兩個(gè)默認(rèn)的定時(shí)任務(wù),負(fù)責(zé)保證任務(wù)運(yùn)行的可靠性[7]。
為了在多個(gè)服務(wù)器間共享調(diào)度器運(yùn)行狀態(tài)信息,調(diào)度器運(yùn)行狀態(tài)監(jiān)測任務(wù)將各服務(wù)器中啟動(dòng)的調(diào)度器狀態(tài)定時(shí)更新到MemCache緩存服務(wù)器上。整體擴(kuò)展架構(gòu)如圖1所示。
數(shù)據(jù)層負(fù)責(zé)調(diào)度任務(wù)運(yùn)行相關(guān)數(shù)據(jù)的存儲(chǔ),關(guān)系型數(shù)據(jù)庫中存儲(chǔ)調(diào)度運(yùn)行規(guī)則Trigger的配置信息,MemeCache緩存中存儲(chǔ)各調(diào)度服務(wù)器的運(yùn)行狀態(tài)及各調(diào)度任務(wù)實(shí)際運(yùn)行的IP地址。
基礎(chǔ)層是對Quartz基本元素Job擴(kuò)展和對Trigger的配置功能,并在Job的擴(kuò)展基礎(chǔ)上實(shí)現(xiàn)兩個(gè)基礎(chǔ)定時(shí)任務(wù):調(diào)度器狀態(tài)監(jiān)測和調(diào)度故障轉(zhuǎn)接,為調(diào)度器管理集群分布的調(diào)度任務(wù)提供基礎(chǔ)服務(wù)支持。對Job的擴(kuò)展主要是增加任務(wù)運(yùn)行狀態(tài)校驗(yàn)、運(yùn)行日志記錄、運(yùn)行容錯(cuò)處理功能,業(yè)務(wù)調(diào)度任務(wù)就基于此擴(kuò)展Job進(jìn)行實(shí)現(xiàn),可將任務(wù)的通用功能和實(shí)際業(yè)務(wù)功能進(jìn)行分離。同時(shí)提供兩個(gè)進(jìn)行集群分布任務(wù)管理的內(nèi)置任務(wù)實(shí)現(xiàn),對任務(wù)運(yùn)行的狀態(tài)進(jìn)行監(jiān)控,實(shí)現(xiàn)服務(wù)異常后的任務(wù)轉(zhuǎn)接運(yùn)行。為支持Trigger的可視化配置,提供一套任務(wù)運(yùn)行規(guī)則配置功能,為Trigger分配Job任務(wù),配置Job運(yùn)行的日期、時(shí)間、定時(shí)間隔、運(yùn)行IP地址、端口及運(yùn)行參數(shù),同一個(gè)調(diào)度規(guī)則允許分配到多臺(tái)服務(wù)器同時(shí)運(yùn)行。配置信息存儲(chǔ)到數(shù)據(jù)庫中,簡化了用戶的配置難度,并支持運(yùn)行中的規(guī)則修改,由調(diào)度管理器根據(jù)配置信息進(jìn)行Trigger的啟動(dòng),對IP、端口的配置不僅支持調(diào)度的水平集群部署,也支持調(diào)度的垂直集群部署。
管理層是調(diào)度任務(wù)集群分布部署的核心控制層,是對Schedule調(diào)度容器的控制擴(kuò)展,定制Scheduler容器的初始化,根據(jù)數(shù)據(jù)庫中調(diào)度運(yùn)行規(guī)則的配置,自動(dòng)生成cron表達(dá)式,按照調(diào)度規(guī)則中的運(yùn)行服務(wù)器IP、端口配置,啟動(dòng)本服務(wù)器上應(yīng)運(yùn)行的任務(wù)規(guī)則,實(shí)現(xiàn)定時(shí)任務(wù)的集群分布運(yùn)行。在啟動(dòng)任務(wù)時(shí)將該任務(wù)運(yùn)行規(guī)則的運(yùn)行參數(shù)、任務(wù)運(yùn)行服務(wù)器的IP、端口等信息添加到任務(wù)的運(yùn)行數(shù)據(jù)中。
3.2 核心任務(wù)功能說明
定時(shí)任務(wù)在集群服務(wù)器上分布運(yùn)行后,需要對調(diào)度器的運(yùn)行狀態(tài)、各任務(wù)的運(yùn)行狀態(tài)進(jìn)行跟蹤,如發(fā)現(xiàn)調(diào)度異常,則對異常的任務(wù)轉(zhuǎn)移到備份服務(wù)器上進(jìn)行運(yùn)行。這一可靠性保障就是通過調(diào)度器狀態(tài)監(jiān)測和調(diào)度故障轉(zhuǎn)接兩個(gè)核心任務(wù)來實(shí)現(xiàn)。
調(diào)度器狀態(tài)監(jiān)測任務(wù)定時(shí)將本服務(wù)器調(diào)度運(yùn)行狀態(tài)在MemCache上進(jìn)行更新,本任務(wù)為內(nèi)置任務(wù),與調(diào)度器進(jìn)行捆綁,調(diào)度器運(yùn)行即啟動(dòng)狀態(tài)監(jiān)測任務(wù)。
調(diào)度故障轉(zhuǎn)接任務(wù)定時(shí)對MemCache上各調(diào)度器的運(yùn)行狀態(tài)進(jìn)行判斷,若發(fā)現(xiàn)某調(diào)度器狀態(tài)超期未進(jìn)行更新,則根據(jù)調(diào)度規(guī)則配置,將安排在該服務(wù)器上運(yùn)行的任務(wù)全部轉(zhuǎn)接到本服務(wù)器上進(jìn)行運(yùn)行,故障服務(wù)器正常運(yùn)行后,轉(zhuǎn)接服務(wù)器上已轉(zhuǎn)接的任務(wù)進(jìn)行停止。
3.3 分布部署結(jié)構(gòu)
通過圖1的Quartz擴(kuò)展架構(gòu)可見集群分布部署時(shí)除業(yè)務(wù)任務(wù)進(jìn)行分布外,還涉及到Schedule調(diào)度器、兩個(gè)內(nèi)置調(diào)度任務(wù)、Trigger配置功能需要進(jìn)行部署才能調(diào)度任務(wù)進(jìn)行運(yùn)行,整體部署結(jié)構(gòu)如圖2所示。
4 結(jié) 論
本文通過對Quartz調(diào)度框架核心元素、集群分布部署的特點(diǎn)分析,及Quartz與Spring集成進(jìn)行應(yīng)用的過程分析,明確出了調(diào)度任務(wù)要在集群上分布部署的關(guān)鍵擴(kuò)展方向,提出了對Quartz擴(kuò)展的架構(gòu),并詳細(xì)說明了對Job、Trigger、Schedule的擴(kuò)展內(nèi)容,最后給出了在集群環(huán)境下Quartz調(diào)度任務(wù)的分布部署結(jié)構(gòu),為集團(tuán)化企業(yè)應(yīng)用系統(tǒng)的調(diào)度任務(wù)集群分布部署提供了實(shí)現(xiàn)案例參考。
參考文獻(xiàn)
[1] 鄭雪松,譚紅楊.Java作業(yè)調(diào)度應(yīng)用實(shí)例分析[J].電腦知識(shí)與技術(shù),2007,3(17):1348?1349.
[2] 胡利強(qiáng),周冬初,王偉.Quartz調(diào)度器與Web程序整合的研究和應(yīng)用[J].計(jì)算機(jī)與現(xiàn)代化,2010(8):95?99.
[3] 丁振凡,李馨梅.Spring的任務(wù)定時(shí)調(diào)度方法的研究比較[J].智能計(jì)算機(jī)與應(yīng)用,2012,2(4):55?57.
[4] 饒浩,謝玄亮,林育東.支持集群部署的企業(yè)MIS系統(tǒng)架構(gòu)分析與構(gòu)建[J].現(xiàn)代制造工程,2010(9):22?25.
[5] 饒浩,謝玄亮.面向服務(wù)的企業(yè)信息系統(tǒng)集群部署方案[J].中國管理信息化,2009,12(14):81?82.
[6] 胡啟敏,薛錦云,鐘林輝.基于Spring框架的輕量級J2EE架構(gòu)與應(yīng)用[J].計(jì)算機(jī)工程與應(yīng)用,2008,44(5):115?118.
[7] 張宇,王映輝,張翔南.基于Spring的MVC框架設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程,2010,36(4):59?62.
[8] 王波.ERP系統(tǒng)中郵件提醒定時(shí)器框架的設(shè)計(jì)與應(yīng)用[J].現(xiàn)代電子技術(shù),2012,35(6):25?27.