现在的位置: 首页 > 综合 > 正文

Quartz资源及与Spring集成简单使用举例

2014年02月06日 ⁄ 综合 ⁄ 共 3932字 ⁄ 字号 评论关闭

       Quartz是一个任务调度框架,任务调度是指按照预先指定好的时间、时间间隔或执行次数来自动执行任务,比如每天早上6:00从控制台上输出 “早上好”。多数的Web项目都具有任务调度的任务,而在java项目中实现任务调度的方式有很多种,这一点在IBM文献《几种任务调度的
Java 实现方法与比较》
中已经陈述并举例了。此文简单整理一下资源,并简做介绍其使用及其与Spring的集成。

       在Quartz官网上你能够找到在线教程、API和实例、jar包等信息。任务调度过程在quartz中牵涉它的两大基本单元,一个是作业(可执行的任务),另一个是触发器。

       要定期执行的作业需要实现org.quartz.job接口,我们要执行的code就在execute方法中。而quartz提供了三种可用的触发器,在《理解Quartz触发器>>。针对触发器CronTrigger值得学习一下Corn表达式,它能够帮助我们灵活的配置具体的日程安排。

       简单说Corn表达式包括七个字段,分别是秒 分 时 月内日期 月 周内日期 年。其中年字段可以忽略不写,即那一年都执行,而其他字段就指明了具体是哪个月哪一天哪个时间执行。需要着重理解一下月内日期和周内日期,分别指几号和周几,这两个指只需要指定一个值,如果在月内日期指定为1号,在周内日期指定为五,但十月一却是周六,发生冲突。具体corn表达式的参数取值和一些特殊符号(-*/#?WLC)用法参考《Quartz
Cron Expression
》一文。

       在java程序中举一个例子。首先写一个Job类,如下所示:

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

 

public class JobService implements Job{   

    @Override

    public void execute(JobExecutionContext arg0) throws JobExecutionException {

       

       System.out.println("早上好");

    }

}

 

之后我们写一个java类配置,并启动调度器,此类代码注释也大致说明了启动调度计划的大致步骤,代码如下所示:

import org.quartz.CronExpression;

import org.quartz.CronTrigger;

import org.quartz.JobDetail;

import org.quartz.Scheduler;

import org.quartz.SchedulerException;

import org.quartz.SchedulerFactory;

import org.quartz.impl.StdSchedulerFactory;

 

public class Review {

    public static void main(String[] args) {

       try{

           //开启调度器

           task();

       }catch(SchedulerException e){

           e.printStackTrace();

       }

    }

     protected static void task() throws SchedulerException

        {

            //初始化SchedulerFactory

            SchedulerFactory schedulerFactory = new StdSchedulerFactory();

            // 获得Scheduler

            Scheduler scheduler = schedulerFactory.getScheduler();

            

            //初始化JobDetail

            JobDetail jobDetail = new JobDetail("工作名称", "所属组名", JobService.class);//注意“JobService.class”就是上面写得Job类

            //初始化cronTrigger

            CronTrigger cronTrigger = new CronTrigger("cronTrigger", "触发器组名");

            try {

               //设定执行日期为每天60:00:00

                CronExpression cexp = new CronExpression("0 0 6 ? * *");

                //指派CronExpression

                cronTrigger.setCronExpression(cexp);

            } catch (Exception e) {

                e.printStackTrace();

            }

            // 安排由触发器和工作详单指定的的工作计划

            scheduler.scheduleJob(jobDetail, cronTrigger);

            

            //开启调度器

            scheduler.start();

        }

}

 

      此时运行这个java类即可每天执行定点执行咱们的任务了。如果我们的作业很多,而且需要在j2EE项目发布运行后就自定开启调度器而不是像上面需要手动启动,我们该如何做呢。

       一个简单的做法可以通过配置web.xml文件,启动服务器时通过初始化servlet来完成启动调度器过程,这个方法的原理应用到quartz与spring集成上,只需要在web.xml文件中配置org.springframework.web.context.ContextLoaderServlet为应用服务器启动时自动运行就可以了。使用spring和quartz集成的好处还有很多。Spring本身具有IOC容器和工厂的作用,这样以来,上述代码中Review类对JobService类的依赖关系以及JobService类对Job接口的依赖都可以屏蔽掉,同时不需要再实际写出Review类,只需要在applicationContext.xml文件中进行一下配置就可以了。同样,这种配置还支持启动多任务,此处只对上面的例子进行改进。

        Job类:

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

 

public class JobService {

    public void execute(){

       System.out.println("早上好");

    }

}

 

       applicationContext.xml文件,它包含了上述Review类的功能:

<!--   job类-->

    <bean id = "JobService" class = "cn.com.jnpc.ecm.bpm.job.JobService "/>

<!--   定义调用对象和调用对象的方法 -->

    <bean id="jobtask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">

        <!-- 调用的类 -->

        <property name="targetObject">

            <ref bean="JobService"/>

        </property>

        <!-- 调用类中的方法 -->

        <property name="targetMethod">

            <value>execute</value>

        </property>

    </bean>

<!--     定义触发时间 -->

    <bean id="doTime" class="org.springframework.scheduling.quartz.CronTriggerBean">

        <property name="jobDetail">

            <ref bean="jobtask"/>

        </property>

        <!-- cron表达式 -->

        <property name="cronExpression">

           <!--设定审查日期每天凌晨60:00:00,执行一次-->

            <value>0 0 6 ? * *</value>

        </property>

    </bean>

<!--     总管理类 如果将lazy-init='false'那么容器启动就会执行调度程序 -->

    <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">

        <property name="triggers">

            <list>

                <ref bean="doTime"/>

            </list>

        </property>

</bean>

        Web.xml文件的配置如下所示,它实现了应用程序服务器启动时自动启动上述配置调度器:

   <context-param>

       <param-name>contextConfigLocation</param-name>

       <param-value>/WEB-INF/applicationContext.xml</param-value>

    </context-param>

    <servlet>

       <servlet-name>context</servlet-name>

       <servlet-class>

        org.springframework.web.context.ContextLoaderServlet

       </servlet-class>

       <load-on-startup>1</load-on-startup>

</servlet>
   掌握这个小例子和几个触发器的使用以及Corn表达式之后便可以解决一些调度任务了,Quartz还有很多高级应用如事务、持久化等等。多参考官方文档,以求提高哦! 

抱歉!评论已关闭.