在web環(huán)境下,Quartz可以通過配置文件來完成后臺(tái)的作業(yè)調(diào)度,不必手工創(chuàng)建Trigger和Scheduler,其步驟如下:
首先將quartz.jar,以及l(fā)ib目錄下面core和optional兩個(gè)目錄中的所有jar全都放入項(xiàng)目WEB-INF\lib目錄下
job就是一個(gè)簡(jiǎn)單的java類,這里的功能就是輸出當(dāng)前的時(shí)間了。
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文件,這個(gè)文件的默認(rèn)名稱就是quartz.properties,如果啟動(dòng)項(xiàng)目的時(shí)候,Quartz沒有在工程中找到該文件,就會(huì)從自己的jar包下面讀取其默認(rèn)的properties文件,其內(nèi)容如下:
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都作了完整的定義,并組合成一個(gè)job。下面,我們把上面兩個(gè)文件都放入/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>
這樣,在啟動(dòng)Tomcat的時(shí)候,QuartzInitializerServlet這個(gè)Servlet就會(huì)自動(dòng)讀取quartz.properties這個(gè)配置文件,并初始化調(diào)度信息,啟動(dòng)Scheduler。
我在這里用的是Quartz1.5.0,在1.5.1中新增加了QuartzInitializerListener,但是似乎有些問題,始終啟動(dòng)不起來,而且更過分的是,它的api居然寫錯(cuò)了,在<listener-class>這個(gè)標(biāo)記中,用了 QuartzInitializerServletListener,就算把機(jī)器砸了,它也找不到這個(gè)類啊!
現(xiàn)在就大功告成了
一個(gè)Job類,一個(gè)quartz.properties文件,一個(gè)quertz_job.xml文件,還有修改一下web.xml文件,很簡(jiǎn)單呀!
不過看起來簡(jiǎn)單,解決的過程卻很郁悶,單單是考慮如何在后臺(tái)進(jìn)程中運(yùn)行Servlet就花了好長(zhǎng)時(shí)間,后來查資料以后才知道可以用Listener或者是啟動(dòng)時(shí)運(yùn)行的Servlet來完成,看來自己的底子還是不扎實(shí)的.
另外就是在Tomcat出現(xiàn)問題的時(shí)候,居然忘了到logs下面去看日志,這個(gè)疏忽是不可原諒的!以后要牢牢記住!