1. 程式人生 > >詳細講解Quartz如何從入門到精通二

詳細講解Quartz如何從入門到精通二

排程一個作業

讓我們通過看一個例子來進入實際討論。現假定你管理一個部門,無論何時候客戶在它的FTP伺服器上儲存一個檔案,都得用電子郵件通知它。我們的作業將用FTP登陸到遠端伺服器並下載所有找到的檔案。

然後,它將傳送一封含有找到和下載的檔案數量的電子郵件。這個作業很容易就幫助人們整天從手工執行這個任務中解脫出來,甚至連晚上都無須考慮。我們可以設定作業迴圈不斷地每60秒檢查一次,而且工作在7×24模式下。這就是Quartz框架完全的用途。

首先建立一個Job類,將執行FTP和Email邏輯。下例展示了Quartz的Job類,它實現了org.quartz.Job介面。

例2.從FTP站點下載檔案和傳送email的Quartz作業

540073.jpg

我們故意讓ScanFTPSiteJob保持很簡單。我們為這個例子建立了一個叫做 JobUtil的實用類。它不是Quartz的組成部分,但對構建各種作業能重用的實用程式庫來說是有意義的。我們可以輕易將那種程式碼組織進作業類 中,quarts 排程器一樣好用,因為我們一直在使用quarts,所以那些程式碼可繼續重用。

JobUtil.checkForFiles() and JobUtil.sendEmail()方法使用的引數是Quartz建立的JobDataMap的例項。例項為每個作業的執行而建立,它是向作業類傳遞配置引數的方法。

這裡並沒有展示JobUtil的實現,但我們能用Jakarta上的Commons Net輕易地實現FTP和Email功能。

用排程器呼叫作業

首先建立一個作業,但為使作業能被排程器呼叫,你得向排程程式說明你的作業的呼叫時間和頻率。這個事情由與作業相關的觸發器來完成。因為我們僅僅對大約每60秒迴圈呼叫作業感興趣,所以打算使用SimpleTrigger。

作業和觸發器通過Quartz排程器介面而被排程。我們需要從排程器工廠類取得一個排程器的例項。最容易的辦法是呼叫StdSchedulerFactory這個類上的靜態方法getDefaultScheduler()。

使用Quartz框架,你需要呼叫start()方法來啟動排程器。例3的程式碼遵循了大多數Quartz應用的一般模式:建立一個或多個作業,建立和設定觸發器,用排程器排程作業和觸發器,啟動排程器。

例3.Quartz作業通過Quartz排程器而被排程

540075.jpg

程式設計排程同聲明性排程

例3中,我們通過程式設計的方法排程我們的ScanFTPSiteJob作業。就是說,我們用Java程式碼來設定作業和觸發器。Quartz框架也支援在xml檔案裡面申明性的設定作業排程。申明性方法允許我們更快速地修改哪個作業什麼時候被執行。

Quartz框架有一個外掛,這個外掛負責讀取xml配置檔案。xml配置檔案包含 了關於啟動Quartz應用的作業和觸發器資訊。所有xml檔案中的作業連同相關的觸發器都被加進排程器。你仍然需要編寫作業類,但配置那些作業類的排程 器則非常動態化。例4展示了一個用申明性方式執行與例3程式碼相同的邏輯的xml配置檔案。

例4.能使用xml檔案排程的作業

540077.jpg

你可以將xml檔案中的元素跟例3程式碼作個比較,它們從概念上來看是相同的。使用例4式的申明性方法的好處是維護變得極其簡單,只需改變xml配置檔案和重新啟動Quartz應用即可。無須修改程式碼,無須重新編譯,無須重新部署。

有狀態和無狀態作業

在本文中你所看到的作業到是無狀態的。這意味著在兩次作業執行之間,不會去維護作業執行時JobDataMap的狀態改變。如果你需要能增、刪,改JobDataMap的值,而且能讓作業在下次執行時能看到這個狀態改變,則需要用Quartz有狀態作業。

如果你是一個有經驗的EJB開發者的話,深信你會立即退縮,因為有狀態帶有負面含義。這主要是由於EJB帶來的伸縮性問題。Quartz有狀態作業實現了org.quartz.StatefulJob介面。

無狀態和有狀態作業的關鍵不同是有狀態作業在每次執行時只有一個例項。大多數情況下,有狀態的作業不迴帶來大的問題。然而,如果你有一個需要頻繁執行的作業或者需要很長時間才能完成的作業,那麼有狀態作業可能給你帶來伸縮性問題。

Quartz框架的其他特徵

Quartz框架有一個豐富的特徵集。事實上,quarts有太多特性以致不能在一種情況中全部領會,下面列出了一些有意思的特徵,但沒時間在此詳細討論。

監聽器和外掛

每個人都喜歡監聽和外掛。今天,幾乎下載任何開源框架,你必定會發現支援這兩個概 念。監聽是你建立的Java類,當關鍵事件發生時會收到框架的回撥。例如,當一個作業被排程、沒有排程或觸發器終止和不再打火時,這些都可以通過設定來來 通知你的監聽器。Quartz框架包含了排程器監聽、作業和觸發器監聽。你可以配置作業和觸發器監聽為全域性監聽或者是特定於作業和觸發器的監聽。

一旦你的一個具體監聽被呼叫,你就能使用這個技術來做一些你想要在監聽類裡面做的 事情。例如,你如果想要在每次作業完成時傳送一個電子郵件,你可以將這個邏輯寫進作業裡面,也可以JobListener裡面。寫進 JobListener的方式強制使用鬆耦合有利於設計上做到更好。

Quartz外掛是一個新的功能特性,無須修改Quartz原始碼便可被建立和新增 進Quartz框架。他為想要擴充套件Quartz框架又沒有時間提交改變給Quartz開發團隊和等待新版本的開發人員而設計。如果你熟悉Struts外掛 的話,那麼完全可以理解Quartz外掛的使用。

與其Quartz提供一個不能滿足你需要的有限擴充套件點,還不如通過使用外掛來擁有可修整的擴充套件點。

叢集Quartz應用

Quartz應用能被叢集,是水平叢集還是垂直叢集取決於你自己的需要。叢集提供以下好處:

· 伸縮性

· 搞可用性

· 負載均衡

目前,Quartz只能藉助關係資料庫和JDBC作業儲存支援叢集。將來的版本這個制約將消失並且用RAMJobStore叢集將是可能的而且將不需要資料庫的支援。

Quartz web應用

使用框架幾個星期或幾個月後,Quartz使用者所顯示的需求之一是需要整合 Quartz到圖形使用者介面中。目前Quartz框架已經有一些工具允許你使用Java servlet來初始化和啟動Quartz。一旦你可以訪問排程器例項,你就可以把它儲存在web容器的servlet上下文中 (ServletContext中)並且可以通過排程器介面管理排程環境。

幸運的是一些開發者已正影響著單機Quartz web應用,它用來更好地管理排程器環境。構建在若干個流行開源框架如Struts和Spring之上的圖形使用者介面支援很多功能,這些功能都被包裝進一個簡單介面。GUI的一個畫面如圖1所示:

540079.gif
圖1.Quartz Web應用允許比較容易地管理Quartz環境

Quartz的下一步計劃

Quartz是一個活動中的工程。Quartz開發團隊明確表示不會停留在已有的榮 譽上。Quartz下一個主要版本已經在啟動中。你可以在OpenSymphony的 wiki上體驗一下Quartz 2.0的設計和特徵。總之,Quartz使用者每天都自由地新增特性建議和設計創意以便能被核心框架考慮(看重)。

瞭解更多Quartz特徵

當你開始使用Quartz框架的更多特性時,User and Developer Forum論壇變成一個回答問題和跟其他Quartz使用者溝通的極其有用的資源。經常去逛逛這個論壇時很有好處的,你也可以依靠James House來共享與你的需要相關的知識和意見。