- 相關(guān)推薦
Quartz開(kāi)發(fā)企業(yè)級任務(wù)調度應用
Quartz 是 OpenSymphony 開(kāi)源組織在任務(wù)調度領(lǐng)域的一個(gè)開(kāi)源項目,完全基于 Java 實(shí)現。該項目于 2009 年被 Terracotta 收購,目前是 Terracotta 旗下的一個(gè)項目。讀者可以到 http://www.quartz-scheduler.org/站點(diǎn)下載 Quartz 的發(fā)布版本及其源代碼。在產(chǎn)品開(kāi)發(fā)中使用的是版本 1.8.4,因此本文內容基于該版本。
作為一個(gè)優(yōu)秀的開(kāi)源調度框架,Quartz 具有以下特點(diǎn):
強大的調度功能,例如支持豐富多樣的調度方法,可以滿(mǎn)足各種常規及特殊需求;
靈活的應用方式,例如支持任務(wù)和調度的多種組合方式,支持調度數據的多種存儲方式;
分布式和集群能力,Terracotta 收購后在原來(lái)功能基礎上作了進(jìn)一步提升。本文暫不討論該部分內容
另外,作為 Spring 默認的調度框架,Quartz 很容易與 Spring 集成實(shí)現靈活可配置的調度功能。
下面是本文中用到的一些專(zhuān)用詞匯,在此聲明:
scheduler:任務(wù)調度器 trigger:觸發(fā)器,用于定義任務(wù)調度時(shí)間規則 job:任務(wù),即被調度的任務(wù) misfire:錯過(guò)的,指本來(lái)應該被執行但實(shí)際沒(méi)有被執行的任務(wù)調度
Quartz 任務(wù)調度的基本實(shí)現原理
核心元素
Quartz 任務(wù)調度的核心元素是 scheduler, trigger 和 job,其中 trigger 和 job 是任務(wù)調度的元數據, scheduler 是實(shí)際執行調度的控制器。
在 Quartz 中,trigger 是用于定義調度時(shí)間的元素,即按照什么時(shí)間規則去執行任務(wù)。Quartz 中主要提供了四種類(lèi)型的 trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和 NthIncludedDayTrigger。這四種 trigger 可以滿(mǎn)足企業(yè)應用中的絕大部分需求。我們將在企業(yè)應用一節中進(jìn)一步討論四種 trigger 的功能。
在 Quartz 中,job 用于表示被調度的任務(wù)。主要有兩種類(lèi)型的 job:無(wú)狀態(tài)的(stateless)和有狀態(tài)的(stateful)。對于同一個(gè) trigger 來(lái)說(shuō),有狀態(tài)的 job 不能被并行執行,只有上一次觸發(fā)的任務(wù)被執行完之后,才能觸發(fā)下一次執行。Job 主要有兩種屬性:volatility 和 durability,其中 volatility 表示任務(wù)是否被持久化到數據庫存儲,而 durability 表示在沒(méi)有 trigger 關(guān)聯(lián)的時(shí)候任務(wù)是否被保留。兩者都是在值為 true 的時(shí)候任務(wù)被持久化或保留。一個(gè) job 可以被多個(gè) trigger 關(guān)聯(lián),但是一個(gè) trigger 只能關(guān)聯(lián)一個(gè) job。
在 Quartz 中, scheduler 由 scheduler 工廠(chǎng)創(chuàng )建:DirectSchedulerFactory 或者 StdSchedulerFactory。 第二種工廠(chǎng) StdSchedulerFactory 使用較多,因為 DirectSchedulerFactory 使用起來(lái)不夠方便,需要作許多詳細的手工編碼設置。 Scheduler 主要有三種:RemoteMBeanScheduler, RemoteScheduler 和 StdScheduler。本文以最常用的 StdScheduler 為例講解。這也是筆者在項目中所使用的 scheduler 類(lèi)。
數據存儲
Quartz 中的 trigger 和 job 需要存儲下來(lái)才能被使用。Quartz 中有兩種存儲方式:RAMJobStore, JobStoreSupport,其中 RAMJobStore 是將 trigger 和 job 存儲在內存中,而 JobStoreSupport 是基于 jdbc 將 trigger 和 job 存儲到數據庫中。RAMJobStore 的存取速度非?,但是由于其在系統被停止后所有的數據都會(huì )丟失,所以在通常應用中,都是使用 JobStoreSupport。
在 Quartz 中,JobStoreSupport 使用一個(gè)驅動(dòng)代理來(lái)操作 trigger 和 job 的數據存儲:StdJDBCDelegate。StdJDBCDelegate 實(shí)現了大部分基于標準 JDBC 的功能接口,但是對于各種數據庫來(lái)說(shuō),需要根據其具體實(shí)現的特點(diǎn)做某些特殊處理,因此各種數據庫需要擴展 StdJDBCDelegate 以實(shí)現這些特殊處理。
【Quartz開(kāi)發(fā)企業(yè)級任務(wù)調度應用】相關(guān)文章:
JSP應用開(kāi)發(fā)的特點(diǎn)10-14
Web Service的開(kāi)發(fā)與應用基礎07-12
企業(yè)級系統架構的技術(shù)特點(diǎn)07-25
LabView開(kāi)發(fā)嵌入式應用的技巧06-07
嵌入式系統的應用和開(kāi)發(fā)09-15
辦公自動(dòng)化的應用與開(kāi)發(fā)07-10
sun認證JSP應用開(kāi)發(fā)背景及特點(diǎn)07-10