spring3.X+quartz1.X和spring4.X+quartz2.x[非动态定时]

下面分开讲解 spring 3.XXX + quartz 1.XXX和 spring4.XXX + quartz2. xxx

一、spring4.XXX + quartz2. xxx

这一部分我就直接上代码吧,不做讲解了

maven:
<properties>
    <spring.version>4.3.0.RELEASE</spring.version>
</properties>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${spring.version}</version>
</dependency>
<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.1</version>
</dependency>

实现类:方法一
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.util.Date;

public class QuartzMethodOne  extends QuartzJobBean {
    private static int counter = 0;
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("-----------QuartzMethodOne");
        //下面是业务的具体实现
        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("-----------QuartzMethodOne");
    }
}

实现类:方法二
import java.util.Date;

public class QuartzMethodTwo {
    private static int counter = 0;

    public void execute() {
        System.out.println("-----------QuartzMethodTwo");
        //下面是业务的具体实现
        long ms = System.currentTimeMillis();
        System.out.println("\t\t" + new Date(ms));
        System.out.println(ms);
        System.out.println("(" + counter++ + ")");
        System.out.println("-----------QuartzMethodTwo");
    }
}

配置文件:
<!-- 配置调度程序quartz ,其中配置JobDetail有两种方式 -->
<!--方式一:使用JobDetailBean,任务类必须实现Job接口 -->
<bean id="one" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <property name="name" value="exampleJob"></property>
    <property name="jobClass" value="com.gxp.quartz.QuartzMethodOne"></property>
    <!--  在这个例子中,jobDataAsMap没有用,此目标类中接受的参数 ,若参数为service,则可以在此进行参数配置,类似struts2 -->
    <property name="jobDataAsMap">
        <map>
            <entry key="service">
                <value>simple is the beat</value>
            </entry>
        </map>
    </property>
</bean>


<!-- 方式二:使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法-->
<!-- 定义目标bean和bean中的方法 -->
<bean id="quartzMethodTwo" class="com.gxp.quartz.QuartzMethodTwo"/>
<bean id="two" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <property name="targetObject">
        <ref bean="quartzMethodTwo"/>
    </property>
    <property name="targetMethod">
        <!-- 要执行的方法名称 -->
        <value>execute</value>
    </property>
</bean>


<!-- =====================方法一:调度触发器 ======================== -->
<!-- 定义simpleTrigger触发器 -->
<!--
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="jobDetail" ref="jobDetail"></property>
    <property name="repeatCount">
        <value>8</value>
    </property>
    <property name="repeatInterval">
        <value>1000</value>
    </property>
    <property name="startDelay">
        <value>4</value>
    </property>
</bean>
-->
<!-- 另一种触发器是CornTrigger -->
<bean id="oneCornTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="one"/>
    <!-- 每个10秒触发 -->
    <property name="cronExpression" value="0/5 * * * * ?"/>
</bean>

<!-- ======================== 方法二:调度触发器 ======================== -->
<bean id="twoCornTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="two"/>
    <!-- 每个10秒触发 -->
    <property name="cronExpression" value="0/5 * * * * ?"/>
</bean>


<!-- ======================== 调度工厂 ======================== -->
<bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="oneCornTrigger"/>
            <ref bean="twoCornTrigger"/>
        </list>
    </property>
</bean>



 二、spring 3.XXX + quartz 1.XXX

参考文章:http://kevin19900306.iteye.com/blog/1397744#comments,http://blog.csdn.net/dos_186/article/details/47784549



最近在研究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.     <properties>  
  2.         <springframework.version>3.0.5.RELEASE</springframework.version>  
  3.     </properties>  
  4.   
  5.     <dependencies>  
  6.         <dependency>  
  7.             <groupId>org.springframework</groupId>  
  8.             <artifactId>spring-context</artifactId>  
  9.             <version>${springframework.version}</version>  
  10.         </dependency>  
  11.   
  12.         <dependency>  
  13.             <groupId>org.springframework</groupId>  
  14.             <artifactId>spring-context-support</artifactId>  
  15.             <version>${springframework.version}</version>  
  16.         </dependency>  
  17.   
  18.         <dependency>  
  19.             <groupId>org.springframework</groupId>  
  20.             <artifactId>spring-tx</artifactId>  
  21.             <version>${springframework.version}</version>  
  22.         </dependency>  
  23.   
  24.         <dependency>  
  25.             <groupId>org.springframework</groupId>  
  26.             <artifactId>spring-web</artifactId>  
  27.             <version>${springframework.version}</version>  
  28.         </dependency>  
  29.   
  30.         <dependency>  
  31.             <groupId>org.quartz-scheduler</groupId>  
  32.             <artifactId>quartz</artifactId>  
  33.             <version>1.8.5</version>  
  34.         </dependency>  
  35.     </dependencies>  
  36.   
  37.     <build>  
  38.         <finalName>${project.artifactId}</finalName>  
  39.         <plugins>  
  40.             <plugin>  
  41.                 <groupId>org.mortbay.jetty</groupId>  
  42.                 <artifactId>jetty-maven-plugin</artifactId>  
  43.                 <version>7.5.4.v20111024</version>  
  44.                 <configuration>  
  45.                     <scanIntervalSeconds>10</scanIntervalSeconds>  
  46.                     <webApp>  
  47.                         <contextPath>/${project.artifactId}</contextPath>  
  48.                     </webApp>  
  49.                 </configuration>  
  50.             </plugin>  
  51.         </plugins>  
  52.     </build>  
  53. </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代码   收藏代码
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import java.util.Date;

public class QuartzMethodOne  extends QuartzJobBean {
    private static int counter = 0;
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("-----------QuartzMethodOne");
        //下面是业务的具体实现
        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("-----------QuartzMethodOne");
    }
}
 
第二种方式的JAVA代码: 
  1. public class QuartzMethodTwo {
        private static int counter = 0;
    
        public void execute() {
            System.out.println("-----------QuartzMethodTwo");
            //下面是业务的具体实现
            long ms = System.currentTimeMillis();
            System.out.println("\t\t" + new Date(ms));
            System.out.println(ms);
            System.out.println("(" + counter++ + ")");
            System.out.println("-----------QuartzMethodTwo");
        }
    }


Spring的配置文件: 

Xml代码   收藏代码
  1. <!------------ 配置调度程序quartz ,其中配置JobDetail有两种方式-------------->    
  2.     <!--方式一:使用JobDetailBean,任务类必须实现Job接口 -->     
  3.     <bean id="one" class="org.springframework.scheduling.quartz.JobDetailBean">    
  4.      <property name="name" value="exampleJob"></property>    
  5.      <property name="jobClass" value="XXXX.QuartzMethodOne"></property>   
  6.      <property name="jobDataAsMap">  
  7. <map>  
  8.     <entry key="service"><value>simple is the beat</value></entry>  
  9. </map>  
  10. ;/property>  
  11.     </bean>   


  1.      <!-- 方式二:使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法-->    
  2.     <!-- 定义目标bean和bean中的方法 -->  
  3.     <bean id="quartzMethodTwo" class="XXXX.QuartzMethodTwo"/>  
  4.     <bean id="two" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  5.     <property name="targetObject">  
  6.         <ref bean="quartzMethodTwo"/>  
  7.     </property>  
  8.     <property name="targetMethod">  <!-- 要执行的方法名称 -->  
  9.         <value>execute</value>  
  10.     </property>  
  11. </bean>  
  12.   

  1. <!-- =====================方法一:调度触发器 ======================== -->  
  2. <bean id="oneCronTrigger class="org.springframework.scheduling.quartz.CronTriggerBean">  
  3.     <property name="jobDetail" ref="one"></property>  
  4.     <property name="cronExpression" value="0/5 * * * * ?"></property>  
  5. </bean>



  1. <!-- ======================== 方法二:调度触发器 ======================== -->  
  2. <bean id="twoCronTrigger class="org.springframework.scheduling.quartz.CronTriggerBean">  
  3.     <property name="jobDetail" ref="two"></property>  
  4.     <property name="cronExpression" value="0/5 * * * * ?"></property>  
  5. </bean>


  1.   
  2. <!-- ======================== 调度工厂 ======================== -->  
  3. <bean id="SpringJobSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
  4.     <property name="triggers">  
  5.         <list>  
  6.             <ref bean="oneCronTrigger"/>
  7.             <ref bean="twoCronTrigger"/>  
  8.         </list>  
  9.     </property>  
  10. </bean>    

最后别忘了在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>  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值