最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现。对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考。

我使用的是Maven来管理项目,需要的Jar包我给大家贴出来。

quartz-1.8.5.jar

commons-logging.jar

spring-core-3.0.5.RELEASE.jar

spring-beans-3.0.5.RELEASE.jar

spring-context-3.0.5.RELEASE.jar

spring-context-support-3.0.5.RELEASE.jar

spring-asm-3.0.5.RELEASE.jar

spring-expression-3.0.5.RELEASE.jar

spring.transaction-3.0.5.RELEASE.jar

spring-web-3.0.5.RELEASE.jar

Maven的pom.xml的配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>QtzTest</groupId>
  7. <artifactId>QtzTest</artifactId>
  8. <version>1.0</version>
  9. <properties>
  10. <springframework.version>3.0.5.RELEASE</springframework.version>
  11. </properties>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.springframework</groupId>
  15. <artifactId>spring-context</artifactId>
  16. <version>${springframework.version}</version>
  17. </dependency>
  18. <dependency>
  19. <groupId>org.springframework</groupId>
  20. <artifactId>spring-context-support</artifactId>
  21. <version>${springframework.version}</version>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.springframework</groupId>
  25. <artifactId>spring-tx</artifactId>
  26. <version>${springframework.version}</version>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework</groupId>
  30. <artifactId>spring-web</artifactId>
  31. <version>${springframework.version}</version>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.quartz-scheduler</groupId>
  35. <artifactId>quartz</artifactId>
  36. <version>1.8.5</version>
  37. </dependency>
  38. </dependencies>
  39. <build>
  40. <finalName>${project.artifactId}</finalName>
  41. <plugins>
  42. <plugin>
  43. <groupId>org.mortbay.jetty</groupId>
  44. <artifactId>jetty-maven-plugin</artifactId>
  45. <version>7.5.4.v20111024</version>
  46. <configuration>
  47. <scanIntervalSeconds>10</scanIntervalSeconds>
  48. <webApp>
  49. <contextPath>/${project.artifactId}</contextPath>
  50. </webApp>
  51. </configuration>
  52. </plugin>
  53. </plugins>
  54. </build>
  55. </project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
&lt;groupId&gt;QtzTest&lt;/groupId&gt;
&lt;artifactId&gt;QtzTest&lt;/artifactId&gt;
&lt;version&gt;1.0&lt;/version&gt; &lt;properties&gt;
&lt;springframework.version&gt;3.0.5.RELEASE&lt;/springframework.version&gt;
&lt;/properties&gt; &lt;dependencies&gt;
&lt;dependency&gt;
&lt;groupId&gt;org.springframework&lt;/groupId&gt;
&lt;artifactId&gt;spring-context&lt;/artifactId&gt;
&lt;version&gt;${springframework.version}&lt;/version&gt;
&lt;/dependency&gt; &lt;dependency&gt;
&lt;groupId&gt;org.springframework&lt;/groupId&gt;
&lt;artifactId&gt;spring-context-support&lt;/artifactId&gt;
&lt;version&gt;${springframework.version}&lt;/version&gt;
&lt;/dependency&gt; &lt;dependency&gt;
&lt;groupId&gt;org.springframework&lt;/groupId&gt;
&lt;artifactId&gt;spring-tx&lt;/artifactId&gt;
&lt;version&gt;${springframework.version}&lt;/version&gt;
&lt;/dependency&gt; &lt;dependency&gt;
&lt;groupId&gt;org.springframework&lt;/groupId&gt;
&lt;artifactId&gt;spring-web&lt;/artifactId&gt;
&lt;version&gt;${springframework.version}&lt;/version&gt;
&lt;/dependency&gt; &lt;dependency&gt;
&lt;groupId&gt;org.quartz-scheduler&lt;/groupId&gt;
&lt;artifactId&gt;quartz&lt;/artifactId&gt;
&lt;version&gt;1.8.5&lt;/version&gt;
&lt;/dependency&gt;
&lt;/dependencies&gt; &lt;build&gt;
&lt;finalName&gt;${project.artifactId}&lt;/finalName&gt;
&lt;plugins&gt;
&lt;plugin&gt;
&lt;groupId&gt;org.mortbay.jetty&lt;/groupId&gt;
&lt;artifactId&gt;jetty-maven-plugin&lt;/artifactId&gt;
&lt;version&gt;7.5.4.v20111024&lt;/version&gt;
&lt;configuration&gt;
&lt;scanIntervalSeconds&gt;10&lt;/scanIntervalSeconds&gt;
&lt;webApp&gt;
&lt;contextPath&gt;/${project.artifactId}&lt;/contextPath&gt;
&lt;/webApp&gt;
&lt;/configuration&gt;
&lt;/plugin&gt;
&lt;/plugins&gt;
&lt;/build&gt;

</project>

特别注意一点,与Spring3.1以下版本整合必须使用Quartz1,最初我拿2.1.3的,怎么搞都报错:


Caused by: org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [org.springframework.scheduling.quartz.CronTriggerBean] for bean with name 'mytrigger' defined in class path resource [applicationContext.xml]: problem with class file or dependent class; nested exception is java.lang.IncompatibleClassChangeError: class org.springframework.scheduling.quartz.CronTriggerBean has interface org.quartz.CronTrigger as super class




查看发现spring3.0.5中org.springframework.scheduling.quartz.CronTriggerBean继承了org.quartz.CronTrigger(public class CronTriggerBeanextends CronTrigger),而在quartz2.1.3中org.quartz.CronTrigger是个接口(publicabstract interface CronTrigger extends Trigger),而在quartz1.8.5及1.8.4中org.quartz.CronTrigger是个类(publicclass CronTrigger extends Trigger),从而造成无法在applicationContext中配置触发器。这是spring3.1以下版本和quartz2版本不兼容的一个bug。(感谢tiren的回复,spring3.1以及以后版本支持quartz2)




在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类和方法仍然是普通类。很显然,第二种方式远比第一种方式来的灵活。




第一种方式的JAVA代码:


  1. package com.ncs.hj;  
  2.   
  3. import org.quartz.JobExecutionContext;  
  4. import org.quartz.JobExecutionException;  
  5. import org.springframework.scheduling.quartz.QuartzJobBean;  
  6.   
  7. public class SpringQtz extends QuartzJobBean{  
  8.     private static int counter = 0;  
  9.     protected void executeInternal(JobExecutionContext context) throws JobExecutionException {  
  10.         System.out.println();  
  11.         long ms = System.currentTimeMillis();  
  12.         System.out.println("\t\t" + new Date(ms));  
  13.         System.out.println(ms);  
  14.         System.out.println("(" + counter++ + ")");  
  15.         String s = (String) context.getMergedJobDataMap().get("service");  
  16.         System.out.println(s);  
  17.         System.out.println();  
  18.     }  
  19. }  
package com.ncs.hj;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

import org.springframework.scheduling.quartz.QuartzJobBean; public class SpringQtz extends QuartzJobBean{

private static int counter = 0;

protected void executeInternal(JobExecutionContext context) throws JobExecutionException {

System.out.println();

long ms = System.currentTimeMillis();

System.out.println("\t\t" + new Date(ms));

System.out.println(ms);

System.out.println("(" + counter++ + ")");

String s = (String) context.getMergedJobDataMap().get("service");

System.out.println(s);

System.out.println();

}

}

第二种方式的JAVA代码:


  1. package com.ncs.hj;  
  2.   
  3. import org.quartz.JobExecutionContext;  
  4. import org.quartz.JobExecutionException;  
  5. import org.springframework.scheduling.quartz.QuartzJobBean;  
  6.   
  7. import java.util.Date;  
  8.   
  9. public class SpringQtz {  
  10.     private static int counter = 0;  
  11.     protected void execute()  {  
  12.         long ms = System.currentTimeMillis();  
  13.         System.out.println("\t\t" + new Date(ms));  
  14.         System.out.println("(" + counter++ + ")");  
  15.     }  
  16. }  
package com.ncs.hj;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

import org.springframework.scheduling.quartz.QuartzJobBean; import java.util.Date; public class SpringQtz {

private static int counter = 0;

protected void execute() {

long ms = System.currentTimeMillis();

System.out.println("\t\t" + new Date(ms));

System.out.println("(" + counter++ + ")");

}

}

Spring的配置文件:


  1. <!------------ 配置调度程序quartz ,其中配置JobDetail有两种方式-------------->    
  2.     <!--方式一:使用JobDetailBean,任务类必须实现Job接口 -->     
  3.     <bean id="myjob" class="org.springframework.scheduling.quartz.JobDetailBean">    
  4.      <property name="name" value="exampleJob"></property>    
  5.      <property name="jobClass" value="com.ncs.hj.SpringQtz"></property>   
  6.      <property name="jobDataAsMap">  
  7. <map>  
  8.     <entry key="service"><value>simple is the beat</value></entry>  
  9. </map>  
  10. ;/property>  
  11.     </bean>   
  12.     <!--运行时请将方式一注释掉! -->    
  13.     <!-- 方式二:使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法-->    
  14.     <!-- 定义目标bean和bean中的方法 -->  
  15.     <bean id="SpringQtzJob" class="com.ncs.hj.SpringQtz"/>  
  16.     <bean id="SpringQtzJobMethod" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  17.     <property name="targetObject">  
  18.         <ref bean="SpringQtzJob"/>  
  19.     </property>  
  20.     <property name="targetMethod">  <!-- 要执行的方法名称 -->  
  21.         <value>execute</value>  
  22.     </property>  
  23. </bean>  
  24.   
  25. <!--  调度触发器  -->  
  26. <bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">  
  27.     <property name="jobDetail" ref="SpringQtzJobMethod"></property>  
  28.     <property name="cronExpression" value="0/5     ?"></property>  
  29. </bean>  
  30.   
  31. <!--  调度工厂  -->  
  32. <bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  33.     <property name="triggers">  
  34.         <list>  
  35.             <ref bean="CronTriggerBean"/>  
  36.         </list>  
  37.     </property>  
  38. </bean>    
    <!------------ 配置调度程序quartz ,其中配置JobDetail有两种方式-------------->

<!--方式一:使用JobDetailBean,任务类必须实现Job接口 -->

<bean id="myjob" class="org.springframework.scheduling.quartz.JobDetailBean">

<property name="name" value="exampleJob"></property>

<property name="jobClass" value="com.ncs.hj.SpringQtz"></property>

<property name="jobDataAsMap">

<map>

<entry key="service"><value>simple is the beat</value></entry>

</map>

</property>

</bean>

<!--运行时请将方式一注释掉! -->

<!-- 方式二:使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法-->

<!-- 定义目标bean和bean中的方法 -->

<bean id="SpringQtzJob" class="com.ncs.hj.SpringQtz"/>

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

<property name="targetObject">

<ref bean="SpringQtzJob"/>

</property>

<property name="targetMethod"> <!-- 要执行的方法名称 -->

<value>execute</value>

</property>

</bean>
&lt;!-- ======================== 调度触发器 ======================== --&gt;
&lt;bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean"&gt;
&lt;property name="jobDetail" ref="SpringQtzJobMethod"&gt;&lt;/property&gt;
&lt;property name="cronExpression" value="0/5 * * * * ?"&gt;&lt;/property&gt;
&lt;/bean&gt; &lt;!-- ======================== 调度工厂 ======================== --&gt;
&lt;bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"&gt;
&lt;property name="triggers"&gt;
&lt;list&gt;
&lt;ref bean="CronTriggerBean"/&gt;
&lt;/list&gt;
&lt;/property&gt;
&lt;/bean&gt;

关于cronExpression表达式,这里讲解一下:

字段 允许值 允许的特殊字符

秒 0-59 , - * /

分 0-59 , - * /

小时 0-23 , - * /

日期 1-31 , - * ? / L W C

月份 1-12 或者 JAN-DEC , - * /

星期 1-7 或者 SUN-SAT , - * ? / L C #

年(可选) 留空, 1970-2099 , - * /

表达式意义

"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期间的每1分钟触发

"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发

"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发

"0 10,44 14 ? 3 WED" 每年三月的星期三的下午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" 每月的第三个星期五上午10:15触发

每天早上6点

0 6 * * *

每两个小时

0 */2 * * *

晚上11点到早上8点之间每两个小时,早上八点

0 23-7/2,8 * * *

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * 1-3

1月1日早上4点

0 4 1 1 *

最后别忘了在web.xml里面配置Spring:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <web-app xmlns="http://java.sun.com/xml/ns/javaee"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  5. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  6. version="2.5">
  7. <welcome-file-list>
  8. <welcome-file>index.html</welcome-file>
  9. </welcome-file-list>
  10. <context-param>
  11. <param-name>contextConfigLocation</param-name>
  12. <param-value>/WEB-INF/spring-config.xml</param-value>
  13. </context-param>
  14. <listener>
  15. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  16. </listener>
  17. </web-app>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
&lt;context-param&gt;
&lt;param-name&gt;contextConfigLocation&lt;/param-name&gt;
&lt;param-value&gt;/WEB-INF/spring-config.xml&lt;/param-value&gt;
&lt;/context-param&gt; &lt;listener&gt;
&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;
&lt;/listener&gt;

</web-app>

运行结果:


Wed Feb 08 13:58:30 CST 2012


(0)


Wed Feb 08 13:58:35 CST 2012


(1)


Wed Feb 08 13:58:40 CST 2012


(2)


Wed Feb 08 13:58:45 CST 2012


(3)


Wed Feb 08 13:58:50 CST 2012


(4)


Wed Feb 08 13:58:55 CST 2012


(5)


Wed Feb 08 13:59:00 CST 2012


(6)

Spring与Quartz的整合实现定时任务调度(转)的更多相关文章

  1. Spring与Quartz的整合实现定时任务调度 以及crontab的用法

    最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考. 我使用的是Maven来管理项目,需要的Jar包我给大家贴 ...

  2. Spring与Quartz的整合实现定时任务调度(转)

    源:http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少 ...

  3. Spring与Quartz的整合实现定时任务调度

    摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我 ...

  4. Spring和Quartz整合实现定时任务调度

    在Spring中可以很方便的使用Quartz来实现定时任务等功能,Quartz主要就是Schedule(任务调度器),Job(作业任务)和Trigger(触发器)三者的关系. 实现方式有多种,在此就介 ...

  5. Spring与Quartz的整合

    Quartz Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制.Quartz允许开发人员根据时间间隔来调度作业.它实现了作业和触发器的多 ...

  6. 控制台基于Quartz.Net组件实现定时任务调度(一)

    前言: 你曾经需要应用执行一个任务吗?比如现在有一个需求,需要每天在零点定时执行一些操作,那应该怎样操作呢? 这个时候,如果你和你的团队是用.NET编程的话,可以考虑使用Quartz.NET调度器.允 ...

  7. Window服务基于Quartz.Net组件实现定时任务调度(二)

    前言: 在上一章中,我们通过利用控制台实现定时任务调度,已经大致了解了如何基于Quartz.Net组件实现任务,至少包括三部分:job(作业),trigger(触发器),scheduler(调度器). ...

  8. 定时任务之Spring与Quartz的整合(有修改)

    转摘:http://www.javaweb1024.com/java/JavaWebzhongji/2015/04/13/548.html 在Spring中使用Quartz有两种方式实现:第一种是任务 ...

  9. Spring Boot 2.x实战之定时任务调度

    在后端开发中,有些场景是需要使用定时任务的,例如:定时同步一批数据.定时清理一些数据,在Spring Boot中提供了@Scheduled注解就提供了定时调度的功能,对于简单的.单机的调度方案是足够了 ...

随机推荐

  1. Oracle锁表处理操作笔记

    --查看锁表进程SQL语句1: SELECT sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, ...

  2. CSS命名实践

    前面的话 每次写HTML结构涉及到CSS命名时,都要挣扎一番.关于CSS命名的规范,市面上有不少,如OOCSS.SMACSS.BEM和MVCSS等.在这里面最火的应该算BEM了.本文将详细介绍CSS命 ...

  3. Storm笔记——技术点汇总

    目录 概况 手工搭建集群 引言 安装Python 配置文件 启动与测试 应用部署 参数配置 Storm命令 原理 Storm架构 Storm组件 Stream Grouping 守护进程容错性(Dae ...

  4. 【javascript】ajax的参数

    1. 常用参数 url type: contentType: dataType: data: success: error 2. 特殊参数 context: 这个对象用于设置Ajax相关回调函数的上下 ...

  5. 【Django】url传递参数

    1.  url传递参数的特殊字符 在压缩后,可能出现  +  -  = 空格  这类特殊字符,需要在传递前进行url编码  urllib.enquote(string) 获取参数后 urllib.un ...

  6. 两百条微信小程序跳坑指南(不定时更新)

    微信小程序联盟出品 跳坑textarea<二百二十三>不显示文本及textarea相关问题集合跳坑<二百一十三> background-image无法获取本地资源图片....跳 ...

  7. 初学 Python(十五)——装饰器

    初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...

  8. java核心技术面试整理

    [前方高能,是这半年BAT,京东,远景,华为,中兴以及苏研发中心被问到的Java公共问题的一个整理] ------------------------------------------------- ...

  9. Github上比较流行的PHP扩展库项目

    这里列出比较常用的PHP开源扩展库项目: swoole, C扩展实现的PHP异步并行网络通信框架,可以重新定义PHP.过去PHP只能做Web项目,现在有了Swoole.任意服务器端程序都可以用PHP来 ...

  10. java_AWT常用组件

    Button:按钮,可接受单击操作. Canvas:用于绘图的画布. Checkbox:复选框组件(也可以变成单选框组件). CheckboxGroup:用于将多个Checkbox组件合成一组,一组C ...