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