如果我們要在 Job 啟動之后改變它的執行時間和頻度,必須去修改源代碼重新編譯。這種方式只適用於小的例子程序,但是對於一個大且復雜的系統,這就成了一個問題了。因此,假如能以聲明式部署 Quart Job 時,並且也是需求允許的情況下,你應該每次都選擇這種方式。
·配置 quartz.properties 文件
文件 quartz.properties 定義了 Quartz 應用運行時行為,還包含了許多能控制 Quartz 運轉的屬性。本章只會講到它的基本配置;更多的高級設置將在以后討論。在現階段也不用太深入到每一項配置有效值的細節。
現在我們來看看最基礎的 quartz.properties 文件,並討論其中一些設置。下面代碼 是一個修剪版的 quartz.propertis 文件。
注 Quartz 框架會為幾乎所有的這些屬性設定默認值。 |
3.7 基本的 Quartz Properties 文件
1 #=============================================================== 2 #Configure Main Scheduler Properties 調度器屬性 3 #=============================================================== 4 org.quartz.scheduler.instanceName = QuartzScheduler 5 org.quartz.scheduler.instanceId = AUTO 6 7 #=============================================================== 8 #Configure ThreadPool 線程池屬性 9 #=============================================================== 10 org.quartz.threadPool.threadCount = 5 11 org.quartz.threadPool.threadPriority = 5 12 org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool 13 14 #=============================================================== 15 #Configure JobStore 作業存儲設置 16 #=============================================================== 17 org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore 18 19 #=============================================================== 20 #Configure Plugins 插件配置 21 #=============================================================== 22 org.quartz.plugin.jobInitializer.class = 23 org.quartz.plugins.xml.JobInitializationPlugin 24 25 org.quartz.plugin.jobInitializer.overWriteExistingJobs = true 26 org.quartz.plugin.jobInitializer.failOnFileNotFound = true 27 org.quartz.plugin.jobInitializer.validating=false
注 這里討論的並沒有涉及到所有可能的設置,僅僅是一些基本的設置。也是你需要去熟悉的,能使聲明式例子運轉起來的必須的設置項。quartz.properties 中的所有屬性配置將會分散在本書中的各章節中依據所在章節涉及內容詳細討論。 |
·調度器屬性
第一部分有兩行,分別設置調度器的實例名(instanceName) 和實例 ID (instanceId)。屬性 org.quartz.scheduler.instanceName 可以是你喜歡的任何字符串。它用來在用到多個調度器區分特定的調度器實例。多個調度器通常用在集群環境中。(Quartz 集群將會在第十一章,“Quartz 集群”中討論)。現在的話,設置如下的一個字符串就行:
org.quartz.scheduler.instanceName = QuartzScheduler
實際上,這也是當你沒有該屬性配置時的默認值。
代碼 3.7 中顯示的調度器的第二個屬性是 org.quartz.scheduler.instanceId。和 instaneName 屬性一樣,instanceId 屬性也允許任何字符串。這個值必須是在所有調度器實例中是唯一的,尤其是在一個集群當中。假如你想 Quartz 幫你生成這個值的話,可以設置為 AUTO。如果 Quartz 框架是運行在非集群環境中,那么自動產生的值將會是 NON_CLUSTERED。假如是在集群環境下使用 Quartz,這個值將會是主機名加上當前的日期和時間。大多情況下,設置為 AUTO 即可。
·線程池屬性
接下來的部分是設置有關線程必要的屬性值,這些線程在 Quartz 中是運行在后台擔當重任的。threadCount 屬性控制了多少個工作者線程被創建用來處理 Job。原則上是,要處理的 Job 越多,那么需要的工作者線程也就越多。threadCount 的數值至少為 1。Quartz 沒有限定你設置工作者線程的最大值,但是在多數機器上設置該值超過100的話就會顯得相當不實用了,特別是在你的 Job 執行時間較長的情況下。這項沒有默認值,所以你必須為這個屬性設定一個值。
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.spi.ThreadPool 接口的類的全限名稱。Quartz 自帶的線程池實現類是 org.quartz.smpl.SimpleThreadPool,它能夠滿足大多數用戶的需求。這個線程池實現具備簡單的行為,並經很好的測試過。它在調度器的生命周期中提供固定大小的線程池。你能根據需求創建自己的線程池實現,如果你想要一個隨需可伸縮的線程池時也許需要這么做。這個屬性沒有默認值,你必須為其指定值。
·作業存儲設置
作業存儲部分的設置描述了在調度器實例的生命周期中,Job 和 Trigger 信息是如何被存儲的。我們還沒有談論到作業存儲和它的目的;因為對當前例子是非必的,所以我們留待以后說明。現在的話,你所要了解的就是我們存儲調度器信息在內存中而不是在關系型數據庫中就行了。
把調度器信息存儲在內存中非常的快也易於配置。當調度器進程一旦被終止,所有的 Job 和 Trigger 的狀態就丟失了。要使 Job 存儲在內存中需通過設置 org.quartz.jobStrore.class 屬性為 org.quartz.simpl.RAMJobStore,就像在代碼 3.7 所做的那樣。假如我們不希望在 JVM 退出之后丟失調度器的狀態信息的話,我們可以使用關系型數據庫來存儲這些信息。這需要另一個作業存儲(JobStore) 實現,我們在后面將會討論到。第五章“Cron Trigger 和其他”和第六章“作業存儲和持久化”會提到你需要用到的不同類型的作業存儲實現。
·插件配置
在這個簡單的 quartz.properties 文件中最后一部分是你要用到的 Quart 插件的配置。插件常常在別的開源框架上使用到,比如 Apache 的 Struts 框架(見 http://struts.apache.org)。
一個聲明式擴框架的方法就是通過新加實現了 org.quartz.spi.SchedulerPlugin 接口的類。SchedulerPlugin 接口中有給調度器調用的三個方法。