Quartz框架是一个极其成功的开源任务调度框架,目前很多公司在实现任务调度上都直接使用或在借鉴的基础上实现了自己的任务调度框架,Quartz使用Trigger,Job和JobDetail对象实现调度各种各样的任务,为了更加便捷地在基于Spring应用中使用该框架,Spring提供了大量的类来简化Quartz的使用步骤;

本篇文章将通过介绍Spring中如何对应Quartz的Trigger,Job,JobDetail方式对整合进行介绍;

一、Quartz的JobDetail对象包含了一个任务运行时需要的各种必要信息,在Spring中,提供了一个JobDetailFactoryBean用来通过XML配置的方式配置Bean属性,首先来看一个例子:

 <!-- Spring配置Job --><bean name="exampleJob"class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><!-- 设置任务类 --><property name="jobClass" value="org.spring.scheduling.quartz.job.ExampleJob" /><!-- 创建JobDetail的描述 --><property name="description" value="job1" /><property name="jobDataAsMap"><map><entry key="timeout" value="5" /><entry key="count" value="10"/></map></property></bean>

可以发现在Spring中通过配置JobDetailFactoryBean来对应Quartz框架中的Job和JobDetail,需要注意的是timeout和count指定在JobDataMap中,该JobDataMap对象可以在运行时通过JobExecutionContext传递给你,对于JobDetail对象而言,它也可以从该JobDataMap中获取它的属性值,如上,我们在jobDataAsMap属性中,配置了timeout和count,那么如果我们的ExampleJob中也有对应属性的话,Spring也会自动赋值,ExampleJob代码如下所示:

package org.spring.scheduling.quartz.job;import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;public class ExampleJob extends QuartzJobBean {private int timeout;public ExampleJob() {// TODO Auto-generated constructor stub}@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {System.out.println(context.getJobDetail().getJobDataMap().get("timeout"));System.out.println(context.getJobDetail().getDescription() + "任务在" + context.getNextFireTime().toLocaleString() + "执行!");}public void setTimeout(int timeout) {// System.out.println("setTimeout得到自动调用,timeout的值为" );this.timeout = timeout;}
}

在上述方法executeInternal方法中,编写要执行的定时任务内容;有的时候你需要指定job的name和group,查看JobDetailFactoryBean会发现里面含有好多属性,如下:


因此可以利用Spring进行属性注入,在此就不演示了;

很多情况下,我们只是想调用某一个对象的某个方法,这个时候就没有必要去让对象所在的类去某个类,只需要利用MethodInvokingJobDetailFactoryBean类就可以实现针对特定某个方法的调用,如下:

package org.spring.scheduling.quartz.service;/** 该类不需要继承或实现任何类和接口*/
public class ExampleServiceObject {// 任务调度将要调用执行的方法public void doIt() {// 该方法内部可以编写实际要操作的内容,同样可以给该方法加事务等}}

Spring配置如下:

 <!-- 将Bean对象纳入Spring的管理范围内 --><bean id="service" class="org.spring.scheduling.quartz.service.ExampleServiceObject" /><!-- 配置工厂bean --><bean id="jobdetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 执行调用方法所在的对象 --><property name="targetObject" ref="service"/><!-- 指定将要执行的方法名称 --><property name="targetMethod" value="doIt"/></bean>

怎么样,配置很简洁吧;

好的,下面接着考虑并发问题,一般来说Quartz的Jobs是无状态的,这就导致了很可能它们彼此之间会产生相互影响,比如有两个触发器同时执行同一个JobDetail类对象,那么就有可能在第一个任务没有执行完之前,第二个任务开始执行,那么如何实现后面的定时任务必须等待前一个定时任务执行完毕再执行呢?问题回到了如何不允许JobDetail并发执行,一般来说,如下两种方式:

package org.spring.scheduling.quartz.job;import org.quartz.DisallowConcurrentExecution;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.StatefulJob;
import org.springframework.scheduling.quartz.QuartzJobBean;
// 通过添加下述注解或实现StatefulJob接口,任意一种方式都可以使Job不能并发执行
@DisallowConcurrentExecution
public class ExampleJob extends QuartzJobBean implements StatefulJob {public ExampleJob() {// TODO Auto-generated constructor stub}@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {// 任务代码}}

那么如果我们使用了MethodInvokingJobDetailFactoryBean该如何禁止方法并发执行呢,这个更简单,只需要加一行配置就可以了,如下:

 <!-- 配置工厂bean --><bean id="jobdetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><!-- 执行调用方法所在的对象 --><property name="targetObject" ref="service"/><!-- 指定将要执行的方法名称 --><property name="targetMethod" value="doIt"/><!-- 禁用并发执行 --><property name="concurrent" value="false"/></bean>

二、通过上述内容,讲解了如何创建Job和JobDetail对象以及并发相关问题,下面简单讲解如何使用Spring的触发器和SchedulerFactoryBean来调度Job和JobDetail对象,在Quartz中提供了若干种triggers,其中最常用的是SimpleTrigger和CronTrigger,针对于此,Spring提供了SimpleTriggerFactoryBean和CronTriggerFactoryBean来提供对Quartz的支持,配置及其简单,如下:

 <bean id="simpleTrigger"class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"><!-- 配置触发器的执行任务 --><property name="jobDetail" ref="jobdetail" /><!-- 10s后执行 --><property name="startDelay" value="10" /><!-- 每个5秒钟出发一次 --><property name="repeatInterval" value="5000" /></bean><bean id="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="exampleJob" /><!-- 在每天早上六点得到执行 --><property name="cronExpression" value="0 0 6 * * ?" /></bean>

三、在二中,讲述了如何创建各种类型的触发器,触发器需要调度,Spring提供了SchedulerFactoryBean类用来通过调度触发器来执行任务,需要将triggers当作属性设置给 SchedulerFactoryBean,配置如下:

 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><ref bean="cronTrigger" /><ref bean="simpleTrigger" /></list></property></bean>

上述几个常用类只是使用了部分属性,在每个类的内部还有大量丰富的配置属性,可以根据需要具体查看,可以这么说之前用Quartz框架能够干的事情在Spring中都可以!!

Spring整合Quartz实现定时任务相关推荐

  1. spring整合quartz框架定时任务实战

    Spring整合定时任务调度框架Quartz实战 2014-09-12 11:51 9707人阅读 评论(6) 收藏 举报  分类: [综合问题](74)  版权声明:本文为博主原创文章,未经博主允许 ...

  2. 使用Spring整合Quartz轻松完成定时任务

    一.背景 上次我们介绍了如何使用Spring Task进行完成定时任务的编写,这次我们使用Spring整合Quartz的方式来再一次实现定时任务的开发,以下奉上开发步骤及注意事项等. 二.开发环境及必 ...

  3. Spring 整合 Quartz 分布式调度

    转载自 Spring 整合 Quartz 分布式调度 本文旨在对 Spring+Quartz 分布式调度有一个直观的了解,通过实际的使用来解决问题. 前言 为了保证应用的高可用和高并发性,一般都会部署 ...

  4. Spring整合Quartz集群部署

    Spring整合Quartz集群部署 Quartz的分布式模式 数据表创建 quartz.properties spring-job.xml Quartz的分布式模式 集群中的每个节点都是一个独立的Q ...

  5. spring整合quartz框架

    前言: 在一些项目中,往往需要定时的去执行一些任务,比如商城项目,每天0点去统计前一天的销量.那么如何实现呢,总不可能我们每天0点手动的去执行统计销量的方法吧,这时就quartz就起作用了. quar ...

  6. Spring配置Quartz实现定时任务

    Spring引入Quartz实现定时任务从头开始: 一.引入jar包 spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错. <p& ...

  7. java 定时任务插件_详解Spring整合Quartz实现动态定时任务

    最近项目中需要用到定时任务的功能,虽然spring 也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整合更为专业的Quartz来实现定时任务功能. 普通定时任务 首先 ...

  8. Spring 和 Quartz 实现定时任务

    Java 定时的四种方式 Quartz 对于继承QuartzJobBean需要做 需要实现定时任务的类继承orgspringframeworkschedulingquartzQuartzJobBean ...

  9. SpringMvc整合Quartz实现定时任务项目源码

             项目中一直使用Quartz做定时任务,但是一直没有去仔细阅读详细参数配置说明以及它源码,最近花了一点时间做了一个整理.系统的看了一下源码实现并顺手做了一个简单的Demo. 一.说明 ...

最新文章

  1. 限流算法——漏桶算法和令牌桶算法介绍
  2. Shell函数:Shell函数返回值、删除函数、在终端调用函数
  3. 详解Python操作Excel文件
  4. 【数据结构】平衡二叉树
  5. 天下无难试之Redis面试刁难大全「原创」
  6. java类的方法 作用 属性_JAVA:类和对象(秒懂版)
  7. 阿里发布藏经阁计划:一年建成知识引擎服务平台
  8. 读jQuery源码释疑笔记3
  9. 【STM32 .Net MF开发板学习-09】AD模拟量采集
  10. telnet中去除ntlm验证的方法
  11. SPSS入门教程——土壤主成分优劣分析
  12. 信号转换 | 如何将正弦波转换成方波?
  13. CDP、私域运营及数字营销相关名词一览
  14. 2021年程序员个人年终工作总结10篇
  15. win10 修改用户名
  16. (E1)ENVI-met介绍及下载
  17. 分享一些实用的手机应用
  18. matplotlib画会动的椭圆
  19. Lua学习第二课_初探lua和lua语法
  20. Coursera 学习记录:细菌分组(通过冒泡排序实现两组有差异的分类)

热门文章

  1. 一步一步跟我学习hadoop(5)----hadoop Map/Reduce教程(2)
  2. Yii2-admin RBAC权限管理的实现
  3. 浏览器兼容console对象的简要解决方案
  4. AjAx下拉列表框(SELECT)jquery插件
  5. python笔记(三) - 变量
  6. Web程序中将Cell华表的修改 保存到数据库或服务器端文件夹内
  7. 关于C语言include尖括号和双引号的对话
  8. matlab2008设置子函数断点无效,程序不在断点处停止
  9. 7-42 行编辑器 (10 分)
  10. Gui+jdbc+mysql实现图书管理