當前位置:編程學習大全網 - 源碼下載 - 詳細講解Quartz如何從入門到精通

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

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

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

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

 Quartz讓作業調度簡單

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

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

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

 Quartz的發展史

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

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

 上手Quartz

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

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

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

 quartz properties文件

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

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

 Quartz內部架構

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

 Quartz調度器

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

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

 作業

 用Quartz的行話講 作業是壹個執行任務的簡單Java類 任務可以是任何Java代碼 只需妳實現 quartz Job接口並且在出現嚴重錯誤情況下拋出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驅動程序和後臺數據庫來持久化調度程序信息 這兩種類型的不同在於妳是否想要控制數據庫事務或這釋放控制給應用服務器例如BEA s WebLogic或Jboss (這類似於J EE領域中 Bean管理的事務和和容器管理事務之間的區別)這兩種JDBC作業存儲是

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

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

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

 作業和觸發器

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

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

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

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

  ? * MON FRI

 下面的表達式

  ? * L

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

 調度壹個作業

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

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

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

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

 JobUtil checkForFiles() and JobUtil sendEmail()方法使用的參數是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有狀態作業實現了 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之上的圖形用戶界面支持很多功能 這些功能都被包裝進壹個簡單接口

 Quartz的下壹步計劃

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

 了解更多Quartz特征

lishixinzhi/Article/program/Java/ky/201311/27892

  • 上一篇:從古至今世界上智商最高的10個人
  • 下一篇:計算機科學與技術,大二了,我該學些什麽呢,現在只會寫幾行代碼
  • copyright 2024編程學習大全網