源:http://kevin19900306.iteye.com/blog/1397744

最近在研究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>

特别注意一点,与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. import org.quartz.JobExecutionContext;
  3. import org.quartz.JobExecutionException;
  4. import org.springframework.scheduling.quartz.QuartzJobBean;
  5. public class SpringQtz extends QuartzJobBean{
  6. private static int counter = 0;
  7. protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
  8. System.out.println();
  9. long ms = System.currentTimeMillis();
  10. System.out.println("\t\t" + new Date(ms));
  11. System.out.println(ms);
  12. System.out.println("(" + counter++ + ")");
  13. String s = (String) context.getMergedJobDataMap().get("service");
  14. System.out.println(s);
  15. System.out.println();
  16. }
  17. }

第二种方式的JAVA代码:

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

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. <bean id="CronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
  26. <property name="jobDetail" ref="SpringQtzJobMethod"></property>
  27. <property name="cronExpression" value="0/5 * * * * ?"></property>
  28. </bean>
  29. <!-- ======================== 调度工厂 ======================== -->
  30. <bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  31. <property name="triggers">
  32. <list>
  33. <ref bean="CronTriggerBean"/>
  34. </list>
  35. </property>
  36. </bean>

关于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>

运行结果:

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的整合实现定时任务调度(转)

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

  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. Zend Guard Loader/Zend Loader是干什么的

    Zend Guard Loader 是加速php的,能提高30%—40%速度.PHP 5.3.X 开始 Zend Optimizer 正式被 Zend Guard Loader 取代.在PHP 5.5 ...

  2. bios中只有windows boot manager下用U盘启动

    在重装系统的时候,很多时候都是先进入bios设置成U盘启动项,然后进行安装,如果年代久远一点的,就设置成光驱启动,再进行:随着时间的推行,光驱已经开始淘汰了,也怀念以前的光驱装机的时光!-:) 开始进 ...

  3. eclipse crash

    SIGSEGV (0xb) at pc=0x00007fbcae8f2c91, pid=5707, tid=140449979574016 JRE version: 7.0_25-b30 Java V ...

  4. Python基础0:变量 赋值 表达式和运算符

    变量: 前面我们在使用print()输出内容的时候,如果内容很长,后面要再次输出的时候,就需重新在输入一遍. 如果给输出的内容起个简单的别名.这样我们用简短的别名来代替长内容,下次要输出的时候就直接使 ...

  5. poj3675 求多边形与圆的面积交

    题意:给出多边形的顶点坐标.圆的圆心坐标和半径,求面积交 sol:又是模板题啦= = 注意poj的C++好像认不出hypot函数,要稍微改写一下. hypot(double x,double y):即 ...

  6. 让AutoMapper更好用

    AutoMapper Dto与EF实体之间的转换用AutoMapper会变的很方便.很高效,是大多数项目的选择.博主本人的项目也在使用AutoMapper这个组件 好用归好用,但是想要把它用好又是另一 ...

  7. CentOS安装MongoDB

    1. touch /etc/yum.repos.d/mongodb.repo vi /etc/yum.repos.d/mongodb.repo [mongodb]        name=MongoD ...

  8. 系统配置 之:远程桌面连接(win7系统)

    本文包括两部分: 1.配置远程桌面连接 2.解决[远程桌面连接不上] 一.远程桌面连接设置 [远程桌面连接配置] Win7系统下的远程桌面连接设置,如果是其他系统或 Win8 及其以上系统,也可作为参 ...

  9. mysql php query steps

    1.mysql connect $db=new mysqli ('localhost','database','user','password'); 2. query $query=select id ...

  10. SSH项目与SSM项目的进入首页的方法

    SSH项目中: jsp页面一般都是存放在WEB-INF下面的目录下,这样我们就不能直接访问到这些jsp页面了,保证了页面的安全性. 在struts的管理中,是利用action来实现页面的跳转,进入in ...