您的位置:首页 > 编程语言 > Java开发

SpringMVC整合Quartz实现定时任务和Crontrigger时间配置和版本问题

2016-11-23 20:04 573 查看
Java中我们常用Timer和TimerTask实现定时功能,而在JavaEE项目中可以使用spring整合Quartz定时器、Spring的Task任务。相比于Spring自带的任务,Quartz非常的强大,能够实现所有想要的定时任务,包括Tomcat服务器开始启动,定时定点定周,集群定时任务等等的任务,有关Quartz的介绍和时间配置网上有很多的资料,就不在累赘,下面主要介绍SpringMVC整合Quartz的实现步骤。

来源博客:http://blog.csdn.net/fengshizty


一、Quartz定时任务


1、引入quartz 

 导入quartz.jar包,或者pom.xml 配置对应的依赖:

     

[html] view
plain copy

 





              <dependency>  

    <groupId>org.quartz-scheduler</groupId>  

    <artifactId>quartz</artifactId>  

    <version>1.8.6</version>  

</dependency>   


2、 Web.xml配置

在Web项目web.xml中配置quartz的配置文件加载路径:

[html] view
plain copy

 





      <servlet>  

<servlet-name>rest</servlet-name>  

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  

<init-param>  

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

    <param-value>  

        /WEB-INF/classes/rest-servlet.xml,   

       /WEB-INF/classes/pyc-spring-quartz.xml  

    </param-value>  

</init-param>   

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

lt;/servlet>   


3、写具体的定时调度的任务:

[java] view
plain copy

 





package andy.test.quartz.schedule;  

  

/**   

 * @author Zhang,Tianyou   

 * @version:2014-12-11 下午12:00:24   

 *  

 *  一个测试的打印定时任务 

 */  

  

public class MyPrintSchedule {  

  

    public void printSomething(){  

        //内容就是打印一句话  

        System.out.println("this is andy schedule");  

    }  

}  

   


4、配置quartz的xml配置信息

    Quartz配置文件名字可以随便,需和web.xml中的一致。

     pyc-spring-quartz.xml配置信息如下:

 

[html] view
plain copy

 





<?xml version="1.0" encoding="UTF-8"?>  

<beans xmlns="http://www.springframework.org/schema/beans"  

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">  

    <!-- 添加调度的任务bean 配置对应的class-->  

    <bean id="myPrintSchedule" class="andy.test.quartz.schedule.MyPrintSchedule" />  

  

    <!--配置调度具体执行的方法-->  

    <bean id="myPrintDetail"  

        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  

        <property name="targetObject" ref="myPrintSchedule" />  

        <property name="targetMethod" value="printSomething" />  

        <property name="concurrent" value="false" />  

    </bean>  

  

    <!--配置调度执行的触发的时间-->  

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

        <property name="jobDetail" ref="myPrintDetail" />  

        <property name="cronExpression">  

            <!-- 每天早上8点执行任务调度 -->  

            <value>0 0 8 * * ?</value>  

        </property>  

    </bean>  

  

      

  

    <!-- quartz的调度工厂 调度工厂只能有一个,多个调度任务在list中添加 -->  

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  

        <property name="triggers">  

            <list>  

                 <!-- 所有的调度列表-->  

                <ref local="myPrintTrigger" />  

                  

            </list>  

        </property>  

    </bean>  

  

</beans>   

这样就实现了myPrint的任务调度,执行时间是每天早上8点执行一次,打印:

     this is andy schedule

这句话。

quartz的功能是非常强大的,使用也非常的简单方便,有事需要web启动时,执行一些初始化的任务,这是我们执行配置对应的执行调度的触发时间就能完成。其具体实现如下:

[html] view
plain copy

 





<!--配置调度执行的触发的时间-->  

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

    <property name="jobDetail" ref="myPrintDetail" />  

    <property name="cronExpression">  

        <!-- 不重复计数,只执行一次 -->  

        <property name="repeatCount" value="0" />  

    </property>  

</bean>   

上面的配置完成了,服务器启动执行的任务。只被执行一次。

1、   CronTrigger时间格式配置说明
CronTrigger配置格式:
格式: [秒] [分] [小时] [日] [月] [周] [年]

序号
说明
是否必填
允许填写的值
允许的通配符
1


0-59 
, - * /
2


0-59
, - * /
3
小时

0-23
, - * /
4


1-31
, - * ? / L W
5


1-12 or JAN-DEC
, - * /
6


1-7 or SUN-SAT
, - * ? / L #
7


empty 或 1970-2099
, - * /
通配符说明:
:表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。
? :表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?
- :表示区间。例如 在小时上设置 "10-12",表示 10,11,12点都会触发。
, :表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发
:用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。 在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次。
L :表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。
例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"
W :表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-").
'L'和 'W'可以一组合使用。如果在日字段上设置"LW",则表示在本月的最后一个工作日触发
 
# :序号(表示每月的第几周星期几),例如在周字段上设置"6#3"表示在每月的第三个周星期六.注意如果指定"6#5",正好第五周没有星期六,则不会触发该配置(用在母亲节和父亲节再合适不过了)
周字段的设置,若使用英文字母是不区分大小写的 MON 与mon相同.
常用示例:
格式: [秒] [分] [小时] [日] [月] [周] [年]
0 0 12 * * ?           每天12点触发 

0 15 10 ? * *          每天10点15分触发 

0 15 10 * * ?          每天10点15分触发  

0 15 10 * * ? *        每天10点15分触发  

0 15 10 * * ? 2005     2005年每天10点15分触发 

0 * 14 * * ?           每天下午的 2点到2点59分每分触发 

0 0/5 14 * * ?         每天下午的 2点到2点59分(整点开始,每隔5分触发)  

0 0/5 14,18 * * ?        每天下午的 18点到18点59分(整点开始,每隔5分触发)
0 0-5 14 * * ?            每天下午的 2点到2点05分每分触发 

0 10,44 14 ? 3 WED        3月分每周三下午的 2点10分和2点44分触发 

0 15 10 ? * MON-FRI       从周一到周五每天上午的10点15分触发 

0 15 10 15 * ?            每月15号上午10点15分触发 

0 15 10 L * ?             每月最后一天的10点15分触发 

0 15 10 ? * 6L            每月最后一周的星期五的10点15分触发 

0 15 10 ? * 6L 2002-2005  从2002年到2005年每月最后一周的星期五的10点15分触发
0 15 10 ? * 6#3           每月的第三周的星期五开始触发 

0 0 12 1/5 * ?            每月的第一个中午开始每隔5天触发一次 

0 11 11 11 11 ?           每年的11月11号 11点11分触发(光棍节)


Spring+Quartz的版本问题

使用Spring配置管理Quartz的时候会遇到下面的异常:

Caused by: java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class  

原因是Spring 3.0版本中内置的Quartz版本是<2.0的,在使用最新的Quartz包(>2.0)之后,接口不兼容。

解决办法有两种:
1.降低Quartz版本,降到1.X去。
2.升级Spring版本到3.1+,根据Spring的建议,将原来的**TriggerBean替换成**TriggerFactoryBean,例如CronTriggerBean
就可以替换成 CronTriggerFactoryBean。替换之后问题解决。
 
2014-04-22补充解决办法:
 
解决办法有三种:
 
1.降低Quartz版本,降到1.X去。
2.升级Spring版本到3.1+,根据Spring的建议,将原来的**TriggerBean替换成**TriggerFactoryBean,例如CronTriggerBean
就可以替换成 CronTriggerFactoryBean。替换之后问题解决。
3.如果不在xml配置文件中引用
Spring 3.0 是支持 Quartz2.2.1(目前最新版本),直接在程序中调用即可。(我们的文件中转站系统用的是
Spring 3.0+quartz 2.2.1集群模式)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: