spring定时任务之-quartz调度器

公司项目里面有个定时任务,一直想弄清楚其流程,以为很难,今天有空研究了一下,发现其实实现很简单。

查资料发现spring的定时任务有很多种,quartz调度器也有两种一种是作业类需继承自特定的基类:org.springframework.scheduling.quartz.QuartzJobBean。

另一种则是作业类不需继承特定基类。我觉得第二种更加简单简洁,公司项目里面也是用到的这种方法。接下来就讲一下具体编写步骤:

第一步:编写任务类

Java代码  

package com.grx.pay.quartz;

/**
    * 定时任务测试类
    * <功能详细描述>
    *
    * @author sun
    * @version [版本号, 2017年4月26日]
    */
    public class quarts_test
    {
    public void run()
    {
    System.out.println("---------------------------------定时任务测试------------------------------------");
    }
    }

第二步:配置作业类

<bean id="test_payOrderTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="test_payOrderManager"></property><!-- 关联的bean -->
        <property name="targetMethod" value="run"></property><!-- 执行的方法 -->
        <property name="concurrent" value="false"/>
        </bean>

//对应第一步中的方法地址

<bean id="test_payOrderManager" class="com.grx.pay.quartz.quarts_test" />

说明:这一步是关键步骤,声明一个MethodInvokingJobDetailFactoryBean,有两个关键属性:targetObject指定任务类,targetMethod指定运行的方法。

第三步:配置作业调度的触发方式(触发器)

<!-- 1分钟执行一次 -->
<bean id="test_payOrderTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="test_payOrderTask" />
<property name="cronExpression" value="0 0/1 * * * ?" />
</bean>

第四步:配置调度工厂 

<!-- 每个定义的任务都要在这里进行引用才能运行 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="test_payOrderTrigger" />
</list>
</property>
</bean>

这样一个定时任务就完成了

下面贴出完整的spring-quartz-test.xml内容,注spring-quartz-test.xml需在springmvc文件中引入(常用引入方法);<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd">

<!-- 每个定义的任务都要在这里进行引用才能运行 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="test_payOrderTrigger" />
</list>
</property>
</bean>

<bean id="test_payOrderManager" class="com.grx.pay.quartz.quarts_test" />

<bean id="test_payOrderTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="test_payOrderManager"></property><!-- 关联的bean -->
<property name="targetMethod" value="run"></property><!-- 执行的方法 -->
<property name="concurrent" value="false"/>
</bean>

<!-- 1分钟执行一次 -->
<bean id="test_payOrderTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="test_payOrderTask" />
<property name="cronExpression" value="0 0/1 * * * ?" />
</bean>

</beans>

附录:

cronExpression的配置说明,具体使用以及参数请百度google

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

秒    0-59    , - * /

分    0-59    , - * /

小时    0-23    , - * /

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

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

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

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

- 区间

* 通配符

? 你不想设置那个字段

下面只例出几个式子

CRON表达式    含义

"0 0 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分每分钟一次触发

"0 0/5 14 * * ?"    每天从下午2点开始到2:55分结束每5分钟一次触发

"0 0/5 14,18 * * ?"    每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发

"0 0-5 14 * * ?"    每天14:00至14:05每分钟一次触发

"0 10,44 14 ? 3 WED"    三月的每周三的14:10和14:44触发

"0 15 10 ? * MON-FRI"    每个周一、周二、周三、周四、周五的10:15触发

时间: 2024-10-12 03:28:19

spring定时任务之-quartz调度器的相关文章

spring定时任务包Quartz版本不兼容

使用spring定时任务包Quartz时,必须使用Quartz1.85以下版本的.     查看发现spring3.0.5中org.springframework.scheduling.quartz.CronTriggerBean继承了     org.quartz.CronTrigger(public class CronTriggerBeanextends CronTrigger),     而在quartz2.1.3中org.quartz.CronTrigger是个接口(publicabs

Spring中Quartz调度器的使用

一.Quartz的特点 * 按作业类的继承方式来分,主要有以下两种: 1.作业类继承org.springframework.scheduling.quartz.QuartzJobBean类的方式 2.作业类不继承org.springframework.scheduling.quartz.QuartzJobBean类的方式 注:个人比较推崇第二种,因为这种方式下的作业类仍然是POJO. * 按任务调度的触发时机来分,主要有以下两种: 1.每隔指定时间则触发一次,对应的调度器为org.springf

spring定时任务之quartz

在Spring中,使用JDK的Timer类库来做任务调度功能不是很方便,关键它不可以象cron服务那样可以指定具体年.月.日.时和分的时间.你只能将时间通过换算成微秒后传给它.如任务是每天执行一次,则需要在spring中如下配置: ­ <bean id="scheduledTask" class= "org.springframework.scheduling.timer.ScheduledTimerTask"> <!--程序启动后开始执行任务的延

SpringMVC中使用 OpenSymphony Quartz 调度器

昨天收到一份笔试题  需要做用到 调度器 今天就开始弄了一下  之前的项目也用过  不过是临时用临时学的 学得不好  今天用的时候发现好多地方不知道 启动的时候老报错 结果是因为包引入少了 quartz-all-1.6.0.jar spring-context-support.jar commons-collections-3.2.jar 一定要是 3.x 的版本 默认ssh是2.X的版本 感觉自己好坑 因为这个错误我还去找了大神 说代码 Quartz使用Trigger, Job以及JobDet

Quartz调度器学习(2)

http://quartz-scheduler.org/documentation/quartz-2.x/cookbook/   定义了诸多如何使用Quartz的示例 1,初始化Scheduler 初始化Scheduler,一种是先创建一个StdSchedulerFactory,然后再从StdSchedulerFactory.getScheduler(),这里获得的Scheduler采用的是默认的配置.另一种是从配置文件中初始化Scheduler. StdSchedulerFactory sf

Spring 3整合Quartz 2实现定时任务(转)

http://www.meiriyouke.net/?p=82 最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 首先,当然是添加依赖的jar文件,我的项目是maven管理的,以下的我项目的依赖: <dependencies> <dependency> <groupId>org.springframework</groupId>

Spring中的定时调度(Scheduling)和线程池(Thread Pooling)

简介 Spring包含了对定时调度服务的内置支持类.当前,Spring支持从JDK1.3开始内置的Timer类和Quartz Scheduler(http://www.opensymphony.com/quartz/).二者都可以通过FactoryBean,分别指向Timer或Trigger实例的引用进行配置.更进一步,有个对Quartz Scheduler和Timer都有效的工具类可以让你调用某个目标对象的方法(类似通常的MethodInvokingFactoryBean操作).Spring

Quartz与Spring集成——启动调度器

前言 在<Quartz与Spring集成--创建调度器>一文中介绍了调度器的创建过程,本文将分析其启动过程.熟悉Spring原理的人都知道AbstractApplicationContext的refresh方法的重要性,在refresh方法中调用了finishRefresh方法,最后会调用到SchedulerFactoryBean的start方法,其调用栈如图1所示. 图1 SchedulerFactoryBean的start方法的调用栈 根据图1的内容,我们知道spring容器初始化完毕的最

Quartz与Spring集成——创建调度器

前言 在<Quartz与Spring集成-- SchedulerFactoryBean的初始化分析>一文中介绍过Spring集成Quartz时的初始化过程,其中简单的提到了创建调度器的方法createScheduler.本文将着重介绍Quartz初始化时是如何创建调度器的. 创建调度器 这里从createScheduler的实现(见代码清单1)来分析,其处理步骤如下: 设置线程上下文的类加载器: 通过单例方法获取SchedulerRepository的实例(见代码清单2): 从调度仓库实例Sc