在web環境下,Quartz可以通過配置文件來完成后臺的作業調度,不必手工創建Trigger和Scheduler,其步驟如下:
首先將quartz.jar,以及lib目錄下面core和optional兩個目錄中的所有jar全都放入項目WEB-INF\lib目錄下
job就是一個簡單的java類,這里的功能就是輸出當前的時間了。
import java.util.Date;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class Helloworld implements Job{
?public Helloworld() {
?}
?private static Log _log = LogFactory
???.getLog(Helloworld.class);
?public void execute(JobExecutionContext context)
???throws JobExecutionException {
??_log.info("Hello World! - " + new Date());
?}
}
然后編寫quartz.properties文件,這個文件的默認名稱就是quartz.properties,如果啟動項目的時候,Quartz沒有在工程中找到該文件,就會從自己的jar包下面讀取其默認的properties文件,其內容如下:
org.quartz.scheduler.instanceName = TestScheduler
org.quartz.scheduler.instanceId = one
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount =? 2
org.quartz.threadPool.threadPriority = 4
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingTriggerHistoryPlugin
org.quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss MM/dd/yyyy}
org.quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.fileName = quartz_job.xml
org.quartz.plugin.jobInitializer.overWriteExistingJobs = false
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.shutdownhook.class = org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownhook.cleanShutdown = true
上面的
org.quartz.plugin.jobInitializer.fileName = quartz_job.xml
是用來配置定義job文件的名稱。
然后編寫quartz_job.xml,
<?xml version="1.0" encoding="UTF-8"?>
<quartz>
? <job>
??? <job-detail>
????? <name>helloworld</name>
????? <group>group1</group>
????? <job-class>Helloworld</job-class>
??? </job-detail>
??? <trigger>
????? <cron>
??????? <name>test</name>
??????? <group>group1</group>
??????? <job-name>helloworld</job-name>
??????? <job-group>group1</job-group>
??????? <cron-expression>0 0/1 * * * ?</cron-expression>
???? </cron>
??? </trigger>
? </job>
</quartz>
可以看到,在配置文件中把jobdetail和trigger都作了完整的定義,并組合成一個job。下面,我們把上面兩個文件都放入/WEB-INF/classes目錄下,然后按照api中的說明修改一下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>
???? </servlet>
這樣,在啟動Tomcat的時候,QuartzInitializerServlet這個Servlet就會自動讀取quartz.properties這個配置文件,并初始化調度信息,啟動Scheduler。
我在這里用的是Quartz1.5.0,在1.5.1中新增加了QuartzInitializerListener,但是似乎有些問題,始終啟動不起來,而且更過分的是,它的api居然寫錯了,在<listener-class>這個標記中,用了 QuartzInitializerServletListener,就算把機器砸了,它也找不到這個類??!
現在就大功告成了
一個Job類,一個quartz.properties文件,一個quertz_job.xml文件,還有修改一下web.xml文件,很簡單呀!
不過看起來簡單,解決的過程卻很郁悶,單單是考慮如何在后臺進程中運行Servlet就花了好長時間,后來查資料以后才知道可以用Listener或者是啟動時運行的Servlet來完成,看來自己的底子還是不扎實的.
另外就是在Tomcat出現問題的時候,居然忘了到logs下面去看日志,這個疏忽是不可原諒的!以后要牢牢記住!