zoukankan      html  css  js  c++  java
  • Spring与Quartz的整合实现定时任务调度

    最近在研究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的配置: 
    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.   
    7.     <groupId>QtzTest</groupId>  
    8.     <artifactId>QtzTest</artifactId>  
    9.     <version>1.0</version>  
    10.   
    11.     <properties>  
    12.         <springframework.version>3.0.5.RELEASE</springframework.version>  
    13.     </properties>  
    14.   
    15.     <dependencies>  
    16.         <dependency>  
    17.             <groupId>org.springframework</groupId>  
    18.             <artifactId>spring-context</artifactId>  
    19.             <version>${springframework.version}</version>  
    20.         </dependency>  
    21.   
    22.         <dependency>  
    23.             <groupId>org.springframework</groupId>  
    24.             <artifactId>spring-context-support</artifactId>  
    25.             <version>${springframework.version}</version>  
    26.         </dependency>  
    27.   
    28.         <dependency>  
    29.             <groupId>org.springframework</groupId>  
    30.             <artifactId>spring-tx</artifactId>  
    31.             <version>${springframework.version}</version>  
    32.         </dependency>  
    33.   
    34.         <dependency>  
    35.             <groupId>org.springframework</groupId>  
    36.             <artifactId>spring-web</artifactId>  
    37.             <version>${springframework.version}</version>  
    38.         </dependency>  
    39.   
    40.         <dependency>  
    41.             <groupId>org.quartz-scheduler</groupId>  
    42.             <artifactId>quartz</artifactId>  
    43.             <version>1.8.5</version>  
    44.         </dependency>  
    45.     </dependencies>  
    46.   
    47.     <build>  
    48.         <finalName>${project.artifactId}</finalName>  
    49.         <plugins>  
    50.             <plugin>  
    51.                 <groupId>org.mortbay.jetty</groupId>  
    52.                 <artifactId>jetty-maven-plugin</artifactId>  
    53.                 <version>7.5.4.v20111024</version>  
    54.                 <configuration>  
    55.                     <scanIntervalSeconds>10</scanIntervalSeconds>  
    56.                     <webApp>  
    57.                         <contextPath>/${project.artifactId}</contextPath>  
    58.                     </webApp>  
    59.                 </configuration>  
    60.             </plugin>  
    61.         </plugins>  
    62.     </build>  
    63. </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代码: 
    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(" " + 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. }  

    第二种方式的JAVA代码: 
    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(" " + new Date(ms));  
    14.         System.out.println("(" + counter++ + ")");  
    15.     }  
    16. }  

    Spring的配置文件: 
    Xml代码  收藏代码
    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>    

    关于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: 
    Xml代码  收藏代码
    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.   
    11.     <context-param>  
    12.         <param-name>contextConfigLocation</param-name>  
    13.         <param-value>/WEB-INF/spring-config.xml</param-value>  
    14.     </context-param>  
    15.   
    16.     <listener>  
    17.         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    18.     </listener>  
    19. </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) 
  • 相关阅读:
    Mvc+三层(批量添加、删除、修改)
    js中判断复选款是否选中
    EF的优缺点
    Git tricks: Unstaging files
    Using Git Submodules
    English Learning
    wix xslt for adding node
    The breakpoint will not currently be hit. No symbols have been loaded for this document."
    Use XSLT in wix
    mfc110ud.dll not found
  • 原文地址:https://www.cnblogs.com/beautiful-code/p/5801889.html
Copyright © 2011-2022 走看看