任務調度 Quartz企業開發介紹

1、Quartz基本概念及原理

Quartz Scheduler開源框架:

Quartz是OpenSymphony開源組織在任務調度領域的開源項目,完全基於java實現。該項目於2009年被Terracotta收購,目前是Terracotta旗下的一個項目。
可以到http://www.quartz-scheduler.org/站點下載Quartz的發佈版本及其源碼。

Quartz特點:
1、強大的調度功能,支持豐富多樣的調度方法,能滿足各種常規及特殊需求;
2、靈活的應用方式,支持和調度的多種方式,支持調度數據的多種存儲方式;
3、分佈式和集羣能力,Terracotta收購後在原來的基礎上做了進一步的提升。
另外,它作爲Spring默認的調度框架,Quartz很容易與Spring集成實現靈活可配置的調度功能。

專用詞彙說明:

scheduler:任務調度器,實際執行調度的控制器;
trigger:觸發器,用於定義任務調度時間規則;
job:任務,即被調用的任務;
misfire:錯過了,指本來應該被執行但實際沒有執行的任務調度;

在Quartz中,scheduler由scheduler工廠創建:DirectSchedulerFactory或者StdSchedulerFactory。第二種工廠StdSchedulerFactory使用較多,因爲第一種使用起來不方便,需要做許多詳細的手工編碼設置。Scheduler主要有三種:RemoveMBeanScheduler,RemoteScheduler和StaScheduler。
trigger是用於定義調度時間的元素,即按照什麼時間規則去執行任務,Quartz中主要有四種類型的trigger:SimpleTrigger,CronTrigger,DatelntervalTrigger和NthlncludedDayTrigger。
job用於被執行調度的任務,主要有兩種類型的job:無態度的(stateless)和有狀態的(stateful)。對於同一個Trigger來說,有狀態的job不能被並行執行,只有上一次被觸發的任務執行完畢後,才能觸發下一次執行。job主要有兩個屬性:volatility和durablity,其中volatility表示任務是否被持續化到數據庫存儲,而durability表示在沒有Trigger關聯的時候任務是否被保留。這兩者都是在值爲true的時候任務被持久化或保留。一個job可以被多個Trigger關聯,但是一個Trigger只能關聯一個job。

數據存儲:

Quartz中的Trigger和job需要存儲下來能使用。Quartz中有兩種存儲方式:RAMJobStore,JobStoreSupport。其中RAMJobStore是將trigger和job存儲在內存中,而JobStoreSupport是基於jdbc將trigger 和job存儲到數據庫中。RAMJobStore的存取速度非常快,但是系統被停止後所有的數據都會丟失,所以在通常應用中,都是使用JobStoreSupport。

2、基本開發流程及簡單實例

環境搭建:

將所需要的jar及其依賴jar導入到classpath即可(此處所用版本爲2.2.1):

最好在開發時將Quartz的源代碼導入到開發環境中來。一方面可以通過閱讀源碼瞭解Quartz的實現原理,另一方面可以通過擴展或修改Quartz的一些類來實現某些尚不提供的功能。

配置文件

A、quartz.properties

#============================================================================

# Configure Main Scheduler Properties 

#============================================================================

org.quartz.scheduler.instanceName = org.quartz.scheduler.instanceId = AUTO
#============================================================================

# Configure ThreadPool 

#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 5

#============================================================================

# Configure Plugins

#============================================================================

org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = quartz-config.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval = 10
配置說明:
配置屬性均以org.quartz開頭。

調度屬性
<pre name="code" class="java"><pre name="code" class="java"># Configure Main Scheduler Properties 


調度器屬性包括兩部分:分別是設置調度的實例名(instanceName) 和(instanceId)。屬性org.quartz.scheduler.instanceName可以是任何的字符串。默認名字一般都採用QuartzScheduler;第二個屬性org.quartz.scheduler.instanceId和instanceName屬性一樣,instanceId屬性也允許任何字符串。這個值必須是所有調度器實例中唯一的,尤其是在一個集羣當中。可以通過Quartz框架生成,設置成AUTO。

線程池屬性
# Configure ThreadPool 
這些線程在Quartz中是運行在後臺擔當重任的。org.quartz.threadPool.class,該值的設置是實現了org.quartz.spi.ThreadPool接口的類的權限名稱。org.quartz.simpleTreadPool,它能夠滿足大多數用戶的需求。這個線程池實現具備簡單的行爲,它在調度的生命週期中提供固定大小的線程池(該屬性無默認值)。
org.quartz.threafPool.threadCount屬性指定了線程池中可同時處理job的數量。至少爲1,無限定最大值,但是大多數機器上設置改值超過100的話性能會明顯下降(該屬性無默認值)。
org.quartz.threafPool.threadPriority屬性指定了工作線程優先級。優先級高的線程比優先級底的線程優先執行。最大值爲10,最小值爲1,正常值爲5,也是大多數情況下設置的值,也是默認的值。

插件配置
# Configure Plugins
org.quartz.plugin.triggHistory.class:屬性值爲org.quartz.plugin.LoggingJobHistoryPlugin表示記錄所有工作執行的歷史(本示例中使用的);另外有org.quartz.plugin.LoggingTriggerHistoryPlugin:觸發器觸發日誌記錄。
org.quartz.plugin.jobInitializer.class指定插件的實現類。
org.quartz.plugin.jobInitializer.fileName:默認會在classpath下尋找quartz_job.xml來獲得聲明的消息。可通過設置改變配置job的文件名。
org.quartz.plugin.jobInitializer.overWriteExistingJobs:爲true時,當有jobDetail被修改不會造成失效(false反之);結合使用另一個配置org.quartz.plugin.jobInitializer.scanInterval=10;自動掃描任務單改動的時間間隔(默認爲0,表示不自動加載),單位爲秒。讀者自行設置即可。
org.quartz.plugin.jobInitializer.failOnFileNotFound=true,基本上設置成true,不是太瞭解這個屬性......

B、quartz-config.xml

<?xml version='1.0' encoding='utf-8'?>
<quartz>
 <job>
	 <job-detail>
	    <name>SendShortMessageJob</name>
	    <group>DEFAULT</group>
	    <description>SendShortMessageJob</description>
	    <job-class>com.homs.quartz.SendShortMessageJob</job-class>
	    <job-data-map allows-transient-data="true">
	     <entry>
		  <key>SendShortMessageJob</key>
	      <value>SendShortMessageJob</value>
	     </entry>
		 </job-data-map>
   </job-detail>
   <trigger>
         <cron>
            <name>SendShortMessageJob</name>
            <group>DEFAULT</group>
            <job-name>SendShortMessageJob</job-name>
            <job-group>DEFALUT</job-group>
			<cron-expression>0 */1 * * * ?</cron-expression>
          </cron>
       </trigger>
 </job></quartz>
job定義一個任務,包括一個job-detail及一個trigger。
<job-detail>中,name指定任務名(唯一);group爲任務所在組(group和name唯一確定一個任務);description任務描述;job-class指定任務多在類;
job-data-map:指定job中設置鍵值對,可在程序中通過JobExecutionContext任務上下文獲取。
<trigger>中,設置觸發器,name爲觸發器名(唯一);group爲觸發器組名;job-name必須和對應的job的name一樣,group同理;常用的觸發器類型,也是企業級開發推薦,通過cron表達式設置,推薦。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章