好,说了这么多,最后让我们来看看如何在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这个类。这个类是用来存取任务执行时的相关信息的,从中我们可以获取当前作业的TriggerSchedulerJobDataMap等等。

当然,Scheduler也有对应的SchedulerContext,具体的用途很像ServletContext。有兴趣的读者自己研究吧。

 

另外就是可以提供一个提示:在一个作业执行的时候,你就可以设定另外一个调度器,去执行另一个Job,这样你可以每个一段时间扫描一下数据库,然后看一看数据库里有没有下一个时间段待发的邮件,然后调用一个新的调度器实例,以便在指定的发送时间将其发送出去。

 

好了,Quartz的相关知识就总结到这里。谢谢大家。

上一篇 Quartz调度框架应用总结(续1)


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