前面我們已經通過編程的方式實現了多個作業任務執行具體操作的演示;但具體到實際的時候,如果我們要在 Job 啓動之後改變它的執行時間和頻度,則必須去修改源代碼重新編譯,我們很難去以編程的形式來實現作業任務的註冊(註冊到任務調度器)和對其的後期維護,爲了便於維護我們將採取配置的形式來實現;
1.quartz.properties
Quartz最重要的配置文件就是quartz.properties;它決定了quartz的運行情況;其中包括了Quartz 應用運行時行爲,以及運行過程中相關屬性;
下面我們將大致描述下quartz.properties的相關配置項:
1)1)Configure Main Scheduler Properties ---·調度器屬性
- org.quartz.scheduler.instanceName = QuartzScheduler
org.quartz.scheduler.instanceName = QuartzScheduler
調度器的實例名(instanceName) ,它用來在用到多個調度器區分特定的調度器實例 - org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.instanceId = AUTO
實例 ID (instanceId),調度器的第二個屬性是 org.quartz.scheduler.instanceId和 instaneName 屬性一樣,instanceId 屬性也允許任何字符串。這個值必須是在所有調度器實例中是唯一的,尤其是在一個集羣當中。假如你想 Quartz 幫你生成這個值的話,可以設置爲 AUTO。如果 Quartz 框架是運行在非集羣環境中,那麼自動產生的值將會是
NON_CLUSTERED。假如是在集羣環境下使用 Quartz,這個值將會是主機名加上當前的日期和時間。大多情況下,設置爲 AUTO 即可。
2)#Configure ThreadPool ---線程池屬性
- org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadCount = 5
接下來的部分是設置有關線程必要的屬性值,這些線程在 Quartz 中是運行在後臺擔當重任的。threadCount 屬性控制了多少個工作者線程被創建用來處理 Job。原則上是,要處理的 Job 越多,那麼需要的工作者線程也就越多。threadCount 的數值至少爲 1。Quartz 沒有限定你設置工作者線程的最大值,但是在多數機器上設置該值超過100的話就會顯得相當不實用了,特別是在你的 Job 執行時間較長的情況下。這項沒有默認值,所以你必須爲這個屬性設定一個值。
- org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadPriority = 5
threadPriority 屬性設置工作者線程的優先級。優先級別高的線程比級別低的線程更優先得到執行。threadPriority 屬性的最大值是常量java.lang.Thread.MAX_PRIORITY,等於10。最小值爲常量 java.lang.Thread.MIN_PRIORITY,爲1。這個屬性的正常值是 Thread.NORM_PRIORITY,爲5。大多情況下,把它設置爲5,這也是沒指定該屬性的默認值。
- org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
最後一個要設置的線程池屬性是 org.quartz.threadPool.class。這個值是一個實現了 org.quartz.spi.ThreadPool 接口的類的全限名稱。Quartz 自帶的線程池實現類是 org.quartz.smpl.SimpleThreadPool,它能夠滿足大多數用戶的需求。這個線程池實現具備簡單的行爲,並經很好的測試過。它在調度器的生命週期中提供固定大小的線程池。你能根據需求創建自己的線程池實現,如果你想要一個隨需可伸縮的線程池時也許需要這麼做。這個屬性沒有默認值,你必須爲其指定值。
3)#Configure JobStore ---作業存儲設置
- org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
作業存儲部分的設置描述了在調度器實例的生命週期中,Job 和 Trigger 信息是如何被存儲的。我們還沒有談論到作業存儲和它的目的;因爲對當前例子是非必的,所以我們留待以後說明。現在的話,你所要了解的就是我們存儲調度器信息在內存中而不是在關係型數據庫中就行了。把調度器信息存儲在內存中非常的快也易於配置。當調度器進程一旦被終止,所有的 Job 和 Trigger 的狀態就丟失了。要使 Job 存儲在內存中需通過設置 org.quartz.jobStrore.class 屬性爲 org.quartz.simpl.RAMJobStore,就像在前面所做的那樣。假如我們不希望在 JVM 退出之後丟失調度器的狀態信息的話,我們可以使用關係型數據庫來存儲這些信息。這需要另一個作業存儲(JobStore) 實現,我們在後面將會討論到。
4)#Configure Plugins --插件配置
- org.quartz.plugin.jobInitializer.class =
- org.quartz.plugins.xml.JobInitializationPlugin
- org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
- org.quartz.plugin.jobInitializer.failOnFileNotFound = true
- org.quartz.plugin.jobInitializer.validating=false
org.quartz.plugin.jobInitializer.class =
org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.validating=false
從上面我們的代碼就可以看出來,配置的爲關於作業初始化的內容;
要在我們的例子中聲明式配置調度器信息,我們會用到一個 Quartz 自帶的叫做 org.quartz.plugins.xml.JobInitializationPlugin 的插件。
默認時,這個插件會在 classpath 中搜索名爲 quartz_jobs.xml 的文件並從中加載 Job 和 Trigger 信息。
當初始化類爲JobInitializationPlugin 的時候,系統將主動到classpath下面去找到job的配置文件;
如果我們使用xml的形式來完成卒作業任務的註冊,則大大提高我們的工作效率和工作的準確性!
我們的ScanDirectoryJob作業的相關信息是在將作業註冊到任務調度器的時候,通過編程的方式來事項初始化的;
現在我們要通過配置文件的時候來完成作業信息初始化的動作;所以我們要將初始化的信息在配置文件上進行體現;
- <?xml version='1.0' encoding='utf-8'?>
- <quartz>
- <job> <!--一個作業是由jobdetail和Trigger來體現的-->
- <job-detail>
- <name>ScanDirectory</name> <!--作業名稱-->
- <group>DEFAULT</group> <!--作業所屬組別-->
- <description>
- A job that scans a directory for files
- </description> <!--作業的相關描述信息-->
- <!--指定作業類文件-->
- <job-class>
- org.cavaness.quartzbook.chapter3.ScanDirectoryJob
- </job-class
- <volatility>false</volatility>
- <durability>false</durability>
- <recover>false</recover>
- <job-data-map allows-transient-data="true">
- <entry>
- <key>SCAN_DIR</key>
- <value>c:\quartz-book\input</value>
- </entry>
- </job-data-map>
- </job-detail>
- <!--聲明觸發器-->
- <trigger>
- <simple>
- <name>scanTrigger</name><!--觸發器的名字-->
- <group>DEFAULT</group>
- <job-name>ScanDirectory</job-name><!--觸發器對於job-->
- <job-group>DEFAULT</job-group>
- <start-time><!--觸發器的啓動時間-->
- 2005-06-10 6:10:00 PM
- </start-time>
- <!-- 重複執行次數和間隔時間-->
- <repeat-count>-1</repeat-count>
- <repeat-interval>10000</repeat-interval>
- </simple>
- </trigger>
- </job>
- </quartz>
<?xml version='1.0' encoding='utf-8'?>
<quartz>
<job> <!--一個作業是由jobdetail和Trigger來體現的-->
<job-detail>
<name>ScanDirectory</name> <!--作業名稱-->
<group>DEFAULT</group> <!--作業所屬組別-->
<description>
A job that scans a directory for files
</description> <!--作業的相關描述信息-->
<!--指定作業類文件-->
<job-class>
org.cavaness.quartzbook.chapter3.ScanDirectoryJob
</job-class
<volatility>false</volatility>
<durability>false</durability>
<recover>false</recover>
<job-data-map allows-transient-data="true">
<entry>
<key>SCAN_DIR</key>
<value>c:\quartz-book\input</value>
</entry>
</job-data-map>
</job-detail>
<!--聲明觸發器-->
<trigger>
<simple>
<name>scanTrigger</name><!--觸發器的名字-->
<group>DEFAULT</group>
<job-name>ScanDirectory</job-name><!--觸發器對於job-->
<job-group>DEFAULT</job-group>
<start-time><!--觸發器的啓動時間-->
2005-06-10 6:10:00 PM
</start-time>
<!-- 重複執行次數和間隔時間-->
<repeat-count>-1</repeat-count>
<repeat-interval>10000</repeat-interval>
</simple>
</trigger>
</job>
</quartz>
當使用JobInitializationPlugin插件的時候,將會主到到classpath下去找quartz_jobs.xml文件並加載進來 ,但如果我們想有自己的配置文件的話,則需要額外的告訴調度器我們現在要使用另一個配置文件來實現作業的註冊;下面的file目錄就是我們的新的配置文件了;
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = my_quartz_jobs.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = true
org.quartz.plugin.jobInitializer.validating = false
org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = true