熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

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

2013-11-23 20:03:54  來源: Java開源技術 

  Quartz是一個開源的作業調度框架它完全由Java寫成並設計用於JSE和JEE應用中它提供了巨大的靈活性而不犧牲簡單性你能夠用它來為執行一個作業而創建簡單的或復雜的調度它有很多特征數據庫支持集群插件EJB作業預構建JavaMail及其它支持cronlike表達式等等

  你曾經需要應用執行一個任務嗎?這個任務每天或每周星期二晚上或許僅僅每個月的最後一天執行一個自動執行而無須干預的任務在執行過程中如果發生一個嚴重錯誤應用能夠知到其執行失敗並嘗試重新執行嗎?你和你的團隊是用Java編程嗎?如果這些問題中任何一個你回答是那麼你應該使用Quartz調度器

  旁注Matrix目前就大量使用到了Quartz比如排名統計功能的實現在Jmatrix裡通過Quartz定義了一個定時調度作業在每天凌晨一點作業開始工作重新統計大家的Karma和排名等還有RSS文件的生成也是通過Quartz定義作業每隔半個小時生成一次RSS XML文件

  Quartz讓作業調度簡單

  Quartz是一個完全由Java編寫的開源作業調度框架不要讓作業調度這個術語嚇著你盡管Quartz框架整合了許多額外功能但就其簡易形式看你會發現它易用得簡直讓人受不了!簡單地創建一個實現orgquartzJob接口的Java類Job接口包含唯一的方法

  在你的Job接口實現類裡面添加一些邏輯到execute()方法一旦你配置好Job實現類並設定好調度時間表Quartz將密切注意剩余時間當調度程序確定該是通知你的作業的時候Quartz框架將調用你Job實現類(作業類)上的execute()方法並允許做它該做的事情無需報告任何東西給調度器或調用任何特定的東西僅僅執行任務和結束任務即可如果配置你的作業在隨後再次被調用Quartz框架將在恰當的時間再次調用它

  如果你使用了其它流行的開源框架象struts你會對Quartz的設計和部件感到舒適雖然兩個開源工程是解決完全不同的問題還是有很多相似的之處就是開源軟件用戶每天感覺很舒適Quartz能用在單機JSE應用中作為一個RMI服務器也可以用在web應用中甚至也可以用在JEE應用服務器中

  Quartz的發展史

  盡管Quartz今年開始受到人們注意但還是暫時流行Quartz由James House創建並最初於年春天被加入sourceforge工程接下來的幾年裡有許多新特征和版本出現但是直到項目遷移到新的站點並成為OpenSymphony項目家族的一員才開始真正啟動並受到應有的關注

  James House仍然和幾個協助他的業余開發者參與大量開發工作Quartz開發團隊今年能發布幾個新版本包括當前正處在候選發布階段的

  上手Quartz

  Quartz工程駐留在OpenSymphony站點上在Quartz站點上可以找到許多有用的資源JavaDocs包含指南的文檔CVS訪問用戶和開發者論壇的連接當然也有下載

  從下載連接取得Quartz的發布版本並且解壓到到本地目錄這個下載文件包含了一個預先構建好的Quartz二進制文件(quartzjar)你可以將它放進自己的應用中Quartz框架只需要少數的第三方庫並且這些三方庫是必需的你很可能已經在使用這些庫了

  你要把Quartz的安裝目錄的/lib/core 和 /lib/optional目錄中的第三方庫加進你自己的工程中大多數第三方庫是我們所熟知和喜歡的標准Jakarta Commons庫像Commons Logging Commons BeantUtils等等

  quartzproperties文件

  Quartz有一個叫做quartzproperties的配置文件它允許你修改框架運行時環境缺省是使用Quartzjar裡面的quartzproperties文件當然你應該創建一個quartzproperties文件的副本並且把它放入你工程的classes目錄中以便類裝載器找到它

  一旦將Quartzjar文件和第三方庫加到自己的工程裡面並且quartzproperties文件在工程的classes目錄中就可以創建作業了然而在做這之前我們暫且回避一下先簡短討論一下Quartz架構

  Quartz內部架構

  在規模方面Quartz跟大多數開源框架類似大約有個Java類和接口並被組織到個包中這可以和Apache Struts把大約個類和接口以及組織到個包中相比盡管規模幾乎不會用來作為衡量框架質量的一個特性但這裡的關鍵是quarts內含很多功能這些功能和特性集是否成為或者應該成為評判一個開源或非開源框架質量的因素

  Quartz調度器

  Quartz框架的核心是調度器調度器負責管理Quartz應用運行時環境調度器不是靠自己做所有的工作而是依賴框架內一些非常重要的部件Quartz不僅僅是線程和線程管理為確保可伸縮性Quartz采用了基於多線程的架構

  啟動時框架初始化一套worker線程這套線程被調度器用來執行預定的作業這就是Quartz怎樣能並發運行多個作業的原理Quartz依賴一套松耦合的線程池管理部件來管理線程環境本文中我們會多次提到線程池管理但Quartz裡面的每個對象是可配置的或者是可定制的所以例如如果你想要插進自己線程池管理設施我猜你一定能!

  作業

  用Quartz的行話講作業是一個執行任務的簡單Java類任務可以是任何Java代碼只需你實現orgquartzJob接口並且在出現嚴重錯誤情況下拋出JobExecutionException異常即可

  Job接口包含唯一的一個方法execute()作業從這裡開始執行一旦實現了Job接口和execute()方法當Quartz確定該是作業運行的時候它將調用你的作業Execute()方法內就完全是你要做的事情下面有一些你要在作業裡面做事情的例子

  · 用JavaMail(或者用其他的像Commons Net一樣的郵件框架)發送郵件

  · 創建遠程接口並且調用在EJB上的方法

  · 獲取Hibernate Session查詢和更新關系數據庫裡的數據

  · 使用OSWorkflow並且從作業調用一個工作流

  · 使用FTP和到處移動文件

  · 調用Ant構建腳本開始預定構建

  這種可能性是無窮的正事這種無限可能性使得框架功能如此強大Quartz給你提供了一個機制來建立具有不同粒度的可重復的調度表於是你只需創建一個Java類這個類被調用而執行任務

  作業管理和存儲

  作業一旦被調度調度器需要記住並且跟蹤作業和它們的執行次數如果你的作業是分鐘後或每秒調用這不是很有用事實上作業執行需要非常准確和即時調用在被調度作業上的execute()方法Quartz通過一個稱之為作業存儲(JobStore)的概念來做作業存儲和管理

  有效作業存儲

  Quartz提供兩種基本作業存儲類型第一種類型叫做RAMJobStore它利用通常的內存來持久化調度程序信息這種作業存儲類型最容易配置構造和運行對許多應用來說這種作業存儲已經足夠了

  然而因為調度程序信息是存儲在被分配給JVM的內存裡面所以當應用程序停止運行時所有調度信息將被丟失如果你需要在重新啟動之間持久化調度信息則將需要第二種類型的作業存儲

  第二種類型的作業存儲實際上提供兩種不同的實現但兩種實現一般都稱為JDBC作業存儲兩種JDBC作業存儲都需要JDBC驅動程序和後台數據庫來持久化調度程序信息這兩種類型的不同在於你是否想要控制數據庫事務或這釋放控制給應用服務器例如BEAs WebLogic或Jboss(這類似於JEE領域中Bean管理的事務和和容器管理事務之間的區別)這兩種JDBC作業存儲是

  · JobStoreTX當你想要控制事務或工作在非應用服務器環境中是使用

  · JobStoreCMT當你工作在應用服務器環境中和想要容器控制事務時使用

  JDBC作業存儲為需要調度程序維護調度信息的用戶而設計

  作業和觸發器

  Quartz設計者做了一個設計選擇來從調度分離開作業Quartz中的觸發器用來告訴調度程序作業什麼時候觸發框架提供了一把觸發器類型但兩個最常用的是SimpleTrigger和CronTriggerSimpleTrigger為需要簡單打火調度而設計

  典型地如果你需要在給定的時間和重復次數或者兩次打火之間等待的秒數打火一個作業那麼SimpleTrigger適合你另一方面如果你有許多復雜的作業調度那麼或許需要CronTrigger

  CronTrigger是基於Calendarlike調度的當你需要在除星期六和星期天外的每天上午點半執行作業時那麼應該使用CronTrigger正如它的名字所暗示的那樣CronTrigger是基於Unix克隆表達式的

  作為一個例子下面的Quartz克隆表達式將在星期一到星期五的每天上午分執行一個作業

   ? * MONFRI

  下面的表達式

   ? * L

  將在年到年的每個月的最後一個星期五上午分執行作業你不可能用SimpleTrigger來做這些事情你可以用兩者之中的任何一個但哪個跟合適則取決於你的調度需要

  調度一個作業

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

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

  首先創建一個Job類將執行FTP和Email邏輯下例展示了Quartz的Job類它實現了orgquartzJob接口

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

  JobUtilcheckForFiles() and JobUtilsendEmail()方法使用的參數是Quartz創建的JobDataMap的實例實例為每個作業的執行而創建它是向作業類傳遞配置參數的方法

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

  用調度器調用作業

  首先創建一個作業但為使作業能被調度器調用你得向調度程序說明你的作業的調用時間和頻率這個事情由與作業相關的觸發器來完成因為我們僅僅對大約每秒循環調用作業感興趣所以打算使用SimpleTrigger

  作業和觸發器通過Quartz調度器接口而被調度我們需要從調度器工廠類取得一個調度器的實例最容易的辦法是調用StdSchedulerFactory這個類上的靜態方法getDefaultScheduler()

  使用Quartz框架你需要調用start()方法來啟動調度器的代碼遵循了大多數Quartz應用的一般模式創建一個或多個作業創建和設置觸發器用調度器調度作業和觸發器啟動調度器

  編程調度同聲明性調度

  我們通過編程的方法調度我們的ScanFTPSiteJob作業就是說我們用Java代碼來設置作業和觸發器Quartz框架也支持在xml文件裡面申明性的設置作業調度申明性方法允許我們更快速地修改哪個作業什麼時候被執行

  Quartz框架有一個插件這個插件負責讀取xml配置文件xml配置文件包含了關於啟動Quartz應用的作業和觸發器信息所有xml文件中的作業連同相關的觸發器都被加進調度器你仍然需要編寫作業類但配置那些作業類的調度器則非常動態化你可以將xml文件中的元素跟例代碼作個比較它們從概念上來看是相同的使用申明性方法的好處是維護變得極其簡單只需改變xml配置文件和重新啟動Quartz應用即可無須修改代碼無須重新編譯無須重新部署

  有狀態和無狀態作業

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

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

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

  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之上的圖形用戶界面支持很多功能這些功能都被包裝進一個簡單接口

  Quartz的下一步計劃

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

  了解更多Quartz特征

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


From:http://tw.wingwit.com/Article/program/Java/ky/201311/27892.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.