使用spring配置quartz定时器

quartz是石英钟的意思,所以用这个名字来做定时器的框架名称再适合不过。一年前做项目的时候有用过这个框架,当时没有整理,今天刚好新的商城系统也需要定时器。想要达到的效果是:每天的固定时间,比如凌晨3:00的时候定时扫描数据库,查看所有的订单,看看这些订单是否超过5天还未付款,如果未付款,则将这部分未付款的订单的状态置为取消(或者说放入垃圾回收站)。功能很清晰简单,以下是具体的做法。

第一步,导包。因为是第三方的框架,自然要导包,导入quartz的jar包,这里导入的是quartz-2.2.1.jar这个版本,将其放入到web-inf下的lib中。

第二步,配置。

项目采用的是SSH框架,最好新建一个spring的配置文件,我给他起名为:quartzSping.xml。如图所示。

记得将这个配置文件引入到主的配置文件applicationContext.xml中,如图所示。仅需在applicationContext.cml的最后加入这样一句话就可以。

接下来就是配置quartzSpring.xml这个文件了。

1.首先,我们先新建一个java类,这个类中的代码将作为定时器触发时所要执行的代码。新建一个RealOrderQuart.java类。如下所示。



package wonyen.yipin.action;

import wonyen.yipin.service.RealOrderService;

public class RealOrderQuartz {
    /**
     * 订单定时扫描,判断是否满足取消条件
     */
    private RealOrderService realOrderService;

    public RealOrderService getRealOrderService() {
        return realOrderService;
    }

    public void setRealOrderService(RealOrderService realOrderService) {
        this.realOrderService = realOrderService;
    }

    public void orderQuartz() {
        //此处编写定时器触发时候执行的代码

    }

}

2.先配置刚才新建的那个java类,如下所示。

    <!-- 订单扫描类 -->
    <bean id="realOrderQuartz" class="wonyen.yipin.action.RealOrderQuartz"
        scope="prototype">
        <property name="commodityClassService" ref="commodityClassService" />
        <property name="searchService" ref="searchService" />
    </bean>

3.配置quartz的任务具体信息,即MethodInvokingJobDetailFactoryBean,任务详情的工厂。

    <!-- quartz任务详情工厂 -->
    <bean id="realOrderQuartzJobDetail"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="realOrderQuartz" />
        </property>
        <property name="targetMethod">  <!-- 要执行的方法名称 -->
            <value>orderQuartz</value>
        </property>
    </bean>

4.配置定时规则触发器,配置定时触发规则有两种不同的实现类,一种是org.springframework.scheduling.quartz.SimpleTriggerBean,另外一种是org.springframework.scheduling.quartz.CronTriggerBean。区别在于前者只能做简单的定时,比如每隔多久触发一次,而后者可以使用cron表达式来自定义定时的规则。这边我采用后者。配置了从周一到周日,每天的3点20触发。cron表达式的具体用法可自行百度。这边的jobDetail属性填写上一步配置的任务详情,即realOrderQuartzJobDetail。

    <!-- 配置定时规则,Cron表达式 ,调度触发器 -->
    <bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"
        id="cronRealOrderTrigger">
        <property name="jobDetail" ref="realOrderQuartzJobDetail">
        </property>
        <!-- 秒 分 时 日 月 星期 -->
        <property name="cronExpression" value="0 20 03 ? * 1,2,3,4,5,6,7">
        </property>
    </bean>

5.配置调度工厂,在调度工厂中,我们调度相应的触发器。这里就是调度上一步配置的cronRealOrderTrigger触发器。

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

这样,我们就配置成功了。

时间: 2024-08-02 23:55:36

使用spring配置quartz定时器的相关文章

spring启动quartz定时器

在很多中经常要用到定时任务,quartz是定时器中比较好用的,在Spring中使用quartz是很容易的事情,首先在spring的applicationContext.xml文件中增加如下配置: <!-- quartz定时器定义 --> <!-- 要调用的工作类,即任务处理类 --> <bean id="quartzJob" class="com.mdnet.travel.core.model.QuartzJob"></be

Spring的quartz定时器重复执行二次的问题解决

Spring的quartz定时器同一时刻重复执行二次的问题解决 最近用Spring的quartz定时器的时候,发现到时间后,任务总是重复执行两次,在tomcat或jboss下都如此. 打印出他们的hashcode,发现是不一样的,也就是说,在web容器启动的时候,重复启了两个quartz线程. 研究下来发现quartz确实会加载两次: 第一次:web容器启动的时候,读取applicationContext.xml文件时,会加载一次. 第二次:Spring本身会加载applicationConte

Spring配置Quartz例子(基于maven构建)

Spring配置Quartz例子(基于maven构建) 在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类和方法仍然是普通类.很显然,第二种方式远比第一种方式来的灵活. 之所以在这里特别对版本作一下说明,是因为spring和quartz的整合对版本是有要求的. spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错. 至于原因,则是spring

Spring中Quartz定时器

Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在Spring中怎样配置Quartz: 首先我们来写一个被调度的类: package com.kay.quartz; public class QuartzJob { public void work()      {      System.out.println("Quartz的任务调度!!!");      } } Spring的配置文件: <?xml version="

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.2版本中内置的Quartz版本与Quartz包2.2中的接口不兼容. 解决办法:Cron

Spring集成Quartz定时器

<!-- Spring集成Quartz开始 --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list>

基于spring和Quartz定时器

最近做一个小项目,要每7天去调用webservice获取一次数据.所以就用定时器来完成spring是4.1.6,quartz是2.2.1. 首先配置spring的xml文件.首先定义你要被执行的类 <!-- 被执行类 --> <bean id="remote" class="com.real.api.utils.InfoQuartz"> </bean> 将用来调度的类注入到job中.其中targetMethod是你在被调度的方法.

Spring集成Quartz定时器实现定时作业任务

这篇文章有点久远了,记得是第一次出来实习时,大三暑假自己找了一家软件公司实习了很长时间,当时学到很多实践性的东西,这个Quartz就是其中一个,还记得是做OA,一些消息需要定时提醒定时删除,项目框架里也没有,当时经验不足也没接触过这样类似的东西,所以用了整一下午的时间算是基本搞定了吧,今天很有兴致,找出这篇大学时写过的几篇文章分享出来,内容如下: 1. 创建一个定时任务并继承类QuartzJobBean并实现其方法executeInternal(JobExecutionContext conte

spring集成quartz定时器的使用

<bean id="autoChangeRangeJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="autoChangeRange" /> <property name="targetMethod