• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Java > 详解Spring整合Quartz实现动态定时任务

详解Spring整合Quartz实现动态定时任务

作者:-糖先生 字体:[增加 减小] 来源:互联网 时间:2017-05-28

-糖先生 通过本文主要向大家介绍了spring定时任务quartz,spring quartz定时器,spring quartz定时,spring整合quartz,spring boot quartz等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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

普通定时任务

首先,当然是添加依赖的jar文件,我的项目是maven管理的,以下的我项目的依赖:

<dependencies>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-core</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${mybatis.version}</version>
  </dependency>
  <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.7.4</version>
  </dependency>
  <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>${mybatis.spring.version}</version>
  </dependency>
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>${slf4j.version}</version>
  </dependency>
  <dependency>
    <groupId>commons-lang</groupId>
    <artifactId>commons-lang</artifactId>
    <version>${commons.lang.version}</version>
  </dependency>
  <dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>${commons.dbcp.version}</version>
  </dependency>
  <dependency>
    <groupId>com.oracle</groupId>
    <artifactId>ojdbc14</artifactId>
    <version>${ojdbc.version}</version>
  </dependency>
  <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>${quartz.version}</version>
  </dependency>
</dependencies>

</div>

或许你应该看出来了,我的项目是spring整合了mybatis,目前spring的最新版本已经到了4.x系列,但是最新版的mybatis-spring的整合插件所依赖推荐的依然是spring 3.1.3.RELEASE,所以这里没有用spring的最新版而是用了推荐的3.1.3.RELEASE,毕竟最新版本的功能一般情况下也用不到。

至于quartz,则是用了目前的最新版2.2.1

之所以在这里特别对版本作一下说明,是因为spring和quartz的整合对版本是有要求的。

spring3.1以下的版本必须使用quartz1.x系列,3.1以上的版本才支持quartz 2.x,不然会出错。

至于原因,则是spring对于quartz的支持实现,org.springframework.scheduling.quartz.CronTriggerBean继承了org.quartz.CronTrigger,在quartz1.x系列中org.quartz.CronTrigger是个类,而在quartz2.x系列中org.quartz.CronTrigger变成了接口,从而造成无法用spring的方式配置quartz的触发器(trigger)。

在Spring中使用Quartz有两种方式实现:第一种是任务类继承QuartzJobBean,第二种则是在配置文件里定义任务类和要执行的方法,类和方法可以是普通类。很显然,第二种方式远比第一种方式来的灵活。

这里采用的就是第二种方式。

spring配置文件:

<!-- 使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法-->
<bean id="taskJob" class="com.tyyd.dw.task.DataConversionTask"/>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <property name="group" value="job_work"/>
  <property name="name" value="job_work_name"/>
  <!--false表示等上一个任务执行完后再开启新的任务-->
  <property name="concurrent" value="false"/>
  <property name="targetObject">
    <ref bean="taskJob"/>
  </property>
  <property name="targetMethod">
    <value>run</value>
  </property>
</bean>

<!-- 调度触发器 -->
<bean id="myTrigger"
   class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
  <property name="name" value="work_default_name"/>
  <property name="group" value="work_default"/>
  <property name="jobDetail">
    <ref bean="jobDetail" />
  </property>
  <property name="cronExpression">
    <value>0/5 * * * * ?</value>
  </property>
</bean>

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

</div>

Task类则是一个普通的Java类,没有继承任何类和实现任何接口(当然可以用注解方式来声明bean):

//@Component
public class DataConversionTask{

  /** 日志对象 */
  private static final Logger LOG = LoggerFactory.getLogger(DataConversionTask.class);

  public void run() {

    if (LOG.isInfoEnabled()) {
      LOG.info("数据转换任务线程开始执行");
    }
  }
}
</div>

至此,简单的整合大功告成,run方法将每隔5秒执行一次,因为配置了concurrent等于false,所以假如run方法的执行时间超过5秒,在执行完之前即使时间已经超过了5秒下一个定时计划执行任务仍不会被开启,如果是true,则不管是否执行完,时间到了都将开启。

接下去,将实现如何动态的修改定时执行的时间,以及如何停止正在执行的任务。

顺便贴一下cronExpression表达式备忘:

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

  1. 秒 0-59 , – * /
  2. 分 0-59 , – * /
  3. 小时 0-23 , – * /
  4. 日期 1-31 , – * ? / L W C
  5. 月份 1-12 或者 JAN-DEC , – * /
  6. 星期 1-7 或者 SUN-SAT , – * ? / L C #
  7. 年(可选) 留空, 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年的每月



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解Spring整合Quartz实现动态定时任务
  • 详解Spring整合Quartz实现动态定时任务

相关文章

  • 2017-05-28SpringBoot下的值注入(推荐)
  • 2017-05-28详解Spring中Bean的加载的方法
  • 2017-05-28Java用 Rhino/Nashorn 代替第三方 JSON 转换库
  • 2017-05-28Java使用join方法暂停当前线程
  • 2017-05-28Spring实现一个简单的SpringIOC容器
  • 2017-05-2830分钟入门Java8之默认方法和静态接口方法学习
  • 2017-05-28java 根据经纬度获取地址实现代码
  • 2017-05-28Spring Boot启动过程完全解析(二)
  • 2017-05-28java生成缩略图的方法示例
  • 2017-05-28Java通过 Socket 实现 TCP服务端

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • java+jsp+struts2实现发送邮件功能
    • Java Socket编程(五) 简单的WEB服务器
    • java异步写日志到文件中实现代码
    • SWT(JFace) Wizard(Eclipse插件编程必备)
    • mybatis教程之延迟加载详解
    • Java通过关闭Socket终止线程
    • Spring boot 默认静态资源路径与手动配置访问路径的方法
    • Java常用字符串工具类 字符串智能截取(3)
    • Spring集成Struts与Hibernate入门详解
    • Java微信公众平台开发(14) 微信web开发者工具使用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有