好,說了這么多,最后讓我們來看看如何在Web應用中使用Quartz。

?

由于Scheduler的配置相當的個性化,所以,在Web應用中,我們可以通過一個quartz.properties文件來配置QuartzServlet。不過之前讓我們先來看看web.xml中如何配置

?

?

web.xml

<servlet>

??????? <servlet-name>

???????????? QuartzInitializer

??????? </servlet-name>

??????? <display-name>

???????????? Quartz Initializer Servlet

??????? </display-name>

??????? <servlet-class>

???????????? org.quartz.ee.servlet.QuartzInitializerServlet

??????? </servlet-class>

??????? <load-on-startup>

???????????? -1

??????? </load-on-startup>

??????? <init-param>

??????????? <param-name>config-file</param-name>

??????????? <param-value>/quartz.properties</param-value>

??????? </init-param>

??????? <init-param>

??????????? <param-name>shutdown-on-unload</param-name>

??????????? <param-value>true</param-value>

??????? </init-param>

??????? <init-param>

??????????? <param-name>start-scheduler-on-load</param-name>

??????????? <param-value>true</param-value>

??????? </init-param>

??? </servlet>

?

這里,load-on-startup是指定QuartzServlet是否隨應用啟動,-1表示否,正數表示隨應用啟動,數值越小,則優先權越高。

初始化參數中,config-file里面可以指定QuartzServlet的配置文件,這里我們用的是quartz.properties。

shutdown-on-unload,表示是否在卸載應用時同時停止調度,該參數推薦true,否則你的tomcat進程可能停不下來。

start-scheduler-on-load,表示應用加載時就啟動調度器,如果為false,則quartz.properties中指定的調度器在用戶訪問這個Servlet之后才會加載,在此之前,如果你通過ServletContext查找SchedulerFactory是可以找到的,但是要得到具體的Scheduler,那么你一定會發現Jvm拋出了一個NullPointerExcetion。

?

下面就來看看quartz.properties的真面目。

quartz.properties

org.quartz.scheduler.instanceName = PushDBScheduler

org.quartz.scheduler.instanceId = one

?

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool

org.quartz.threadPool.threadCount = 4

org.quartz.threadPool.threadPriority = 4

?

org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin

org.quartz.plugin.jobInitializer.fileName = quartz_job.xml

?

我想不用多說,大家都看出來了,首先配置了基本的Scheduler實例名,并分配了ID,然后為這個調度器設定了線程池,后面是初始化插件。初始化插件是Quartz非常實用的功能,你可以用這個功能來實現Quartz的擴展性。這里配置的插件是讀取job XML文件,讓調度器自動載入Job。這個插件現在支持讀取多個job XML文件,但是我現在還沒有試過,感興趣的讀者可以自己嘗試。另外就是有一個scanInterval屬性,表示每隔幾秒自動掃描一次job XML文件,我現在也沒有試過,感興趣的讀者可以自己試驗一下。注意,該參數設定為0表示不掃描。

?

最后,我們來看看job XML文件,這里以quartz_job.xml為例

quartz_job.xml

<quartz>

??? <job>?

??????? <job-detail>?

??????????? <name>ScanItemsInDB</name>?

??????????? <group>Scanning</group>?

??????????? <job-class>com.testquartz.ScanDB</job-class>

??????????? <job-data-map allows-transient-data="true">

???????????????? <entry>

????????????????? <key>testmode</key>

????????????????? <value>true</value>

???????????????? </entry>

??????????? </job-data-map>

??????? </job-detail>?

??????? <trigger>?

??????????? <cron>?

??????????????? <name>t1</name>?

??????????????? <group> Scanning </group>?

??????????????? <job-name> ScanItemsInDB </job-name>?

??????????????? <job-group> Scanning </job-group>?

??????????????? <cron-expression>0 0/5 * * * ?</cron-expression>?

??????????? </cron>?

??????? </trigger>?

??? </job>?

</quartz>

?

這個文件真是非常顯而易見了,我就不多說了,大家自己研究吧。

然后你只要自己寫一下ScanDB這個類就可以了。

ScanDB.java

public class ScanDB implements Job {

???? public void execute(JobExecutionContext context) throws JobExecutionException {

????????? //你的代碼

???? }

}

?

注意JobExecutionContext這個類。這個類是用來存取任務執行時的相關信息的,從中我們可以獲取當前作業的TriggerScheduler、JobDataMap等等。

當然,Scheduler也有對應的SchedulerContext,具體的用途很像ServletContext。有興趣的讀者自己研究吧。

?

另外就是可以提供一個提示:在一個作業執行的時候,你就可以設定另外一個調度器,去執行另一個Job,這樣你可以每個一段時間掃描一下數據庫,然后看一看數據庫里有沒有下一個時間段待發的郵件,然后調用一個新的調度器實例,以便在指定的發送時間將其發送出去。

?

好了,Quartz的相關知識就總結到這里。謝謝大家。

上一篇 Quartz調度框架應用總結(續1)


文章來源:http://x-spirit.spaces.live.com/Blog/cns!CC0B04AE126337C0!554.entry