在java中我们常用Timer和TimerTask实现定时功能,而在JavaEE项目中可以使用Spring整合Quartz定时器、Spring的Task任务。相比于Spring自带的任务,Quartz非常的强大,能够实现所有想要的定时任务,包括Tomcat服务器开始启动,定时定点定周,集群定时任务等等的任务,有关Quartz的介绍和时间配置网上有很多的资料,就不在累赘,下面主要介绍SpringMVC整合Quartz的实现步骤。

来源博客:http://blog.csdn.net/fengshizty

一、Quartz定时任务

1、引入quartz

导入quartz.jar包,或者pom.xml 配置对应的依赖:

                <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>1.8.6</version></dependency> 

2、 Web.xml配置

在Web项目web.xml中配置quartz的配置文件加载路径:

        <servlet><servlet-name>rest</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/classes/rest-servlet.xml, /WEB-INF/classes/pyc-spring-quartz.xml</param-value></init-param> <load-on-startup>1</load-on-startup></servlet> 

3、写具体的定时调度的任务:

package andy.test.quartz.schedule;/**  * @author Zhang,Tianyou  * @version:2014-12-11 下午12:00:24  * *  一个测试的打印定时任务*/public class MyPrintSchedule {public void printSomething(){//内容就是打印一句话System.out.println("this is andy schedule");}
}

4、配置quartz的xml配置信息

Quartz配置文件名字可以随便,需和web.xml中的一致。

pyc-spring-quartz.xml配置信息如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- 添加调度的任务bean 配置对应的class--><bean id="myPrintSchedule" class="andy.test.quartz.schedule.MyPrintSchedule" /><!--配置调度具体执行的方法--><bean id="myPrintDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="myPrintSchedule" /><property name="targetMethod" value="printSomething" /><property name="concurrent" value="false" /></bean><!--配置调度执行的触发的时间--><bean id="myPrintTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail" ref="myPrintDetail" /><property name="cronExpression"><!-- 每天早上8点执行任务调度 --><value>0 0 8 * * ?</value></property></bean><!-- quartz的调度工厂 调度工厂只能有一个,多个调度任务在list中添加 --><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><!-- 所有的调度列表--><ref local="myPrintTrigger" /></list></property></bean></beans> 

这样就实现了myPrint的任务调度,执行时间是每天早上8点执行一次,打印:

this is andy schedule

这句话。

quartz的功能是非常强大的,使用也非常的简单方便,有事需要web启动时,执行一些初始化的任务,这是我们执行配置对应的执行调度的触发时间就能完成。其具体实现如下:

 <!--配置调度执行的触发的时间--><bean id="myPrintTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"><property name="jobDetail" ref="myPrintDetail" /><property name="cronExpression"><!-- 不重复计数,只执行一次 --><property name="repeatCount" value="0" /></property></bean> 

上面的配置完成了,服务器启动执行的任务。只被执行一次。

二、Spring自带的任务Task

Spring自带的定时任务是在spring3之后支持,相比于quartz定时任务Spring相对于简单,配置也很简单。quartz功能比Spring Task强大,支持集群功能。

1、在spring配置中添加task的schema

pring配置文件头中添加命名空间及描述

 <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" //....其他xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd //.....其他http://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-4.1.xsd"> 

2、开启扫描定时任务包

 <context:component-scan base-package="org.andy.task" /> 

3、配置开启任务

 <task:annotation-driven /> 

如果任务比较多,可以添加任务池

 <task:scheduler id="scheduler" pool-size="5" />
<task:annotation-driven executor="executor" scheduler="scheduler" />如果定时任务很多,可以配置executor线程池,这里executor的含义和java.util.concurrent.Executor是一样的,pool-size的大小官方推荐为5~10。scheduler的pool-size是ScheduledExecutorService线程池 

4、Spring的POJO任务类

package org.andy.task;import org.apache.log4j.Logger;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** 创建时间:2016年5月12日 下午3:48:38* * @author andy* @version 2.2*/
@Component("taskJob")
public class TaskJob {private static final Logger LOG = Logger.getLogger(TaskJob.class);//每分钟的10秒执行@Scheduled(cron = "10 * * * * ?")public void job1(){LOG.info("hello。。。。"); }//每10秒执行一次@Scheduled(fixedRate = 1000 * 1) public void job(){LOG.info("world");}
}

三、定时配置

spring的task和quartz的任务格式都是一样的。

Cron表达式包括下面7个字段并区别顺序:秒0-59,分0-59,小时0-23,月内日期1-31,月1-12或者JAN-DEC,周内日期1-7或者SUN-SAT,年(可选字段)留空或者1970-2099并且通过特殊字符表示特殊意义,具体为下:斜线(/)字符表示增量值。例如,在秒字段中"5/15"代表从第5秒开始,每15秒一次。问号(?)字符和字母L字符只有在月内日期和周内日期字段中可用。问号表示这个字段不包含具体值。所以,如果指定月内日期,可以在周内日期字段中插入"?",表示周内日期值无关紧要。这里有个很蛋疼的设定,无关Quartz,而是Spring集成Quartz后,它自己加的一个约束,那就是:日期(1-31)和星期(SUN-SAT)两者,必须有一个是问号(?),系统在启动的时候,Spring会检查表达式,如果不符合它的规则,就会抛异常。所以在使用的时候这个地方一定要注意,而这个在Linux上执行Cron是没有这个限制的。字母L字符是last的缩写。放在月内日期字段中,表示安排在当月最后一天执行。在周内日期字段中,如果"L"单独存在,就等于"7",否则代表当月内周内日期的最后一个实例。所以"0L"表示安排在当月的最后一个星期日执行。字母(W)字符把执行安排在最靠近指定值的工作日。把"1W"放在月内日期字段中,表示把执行安排在当月的第一个工作日内。井号(#)字符为给定月份指定具体的工作日实例。把"MON#2"放在周内日期字段中,表示把任务安排在当月的第二个星期一。星号(*)字符是通配字符,表示该字段可以接受任何可能的值、表达式例子。例子:"0 0 08 * * ?" 每天上午8点触发"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 2009-2019" 2009年至2019年的每月的最后一个星期五上午10:15触发"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

来源博客:http://blog.csdn.net/fengshizty

SpringMVC整合Quartz实现定时任务和Spring自带Task定时任务相关推荐

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

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

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

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

  3. Spring 3整合Quartz 2实现定时任务--转

    常规整合 http://www.meiriyouke.net/?p=82 最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之 ...

  4. Spring Boot定时任务-SpringBoot整合Quartz

    如何通过SpringBoot整合Quartz框架,我们首先去创建一个项目,接下来我们需要在pom文件里添加坐标,我们在使用SpringBoot整合Quartz的时候,需要添加哪些坐标呢,我们来看一下, ...

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

    http://www.meiriyouke.net/?p=82 最近工作中需要用到定时任务的功能,虽然Spring3也自带了一个轻量级的定时任务实现,但感觉不够灵活,功能也不够强大.在考虑之后,决定整 ...

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

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

  7. Spring Boot 2.x整合Quartz

    宣传官网 xb.exrick.cn 在线Demo xboot.exrick.cn 开源版Github地址 github.com/Exrick/x-bo- 开发文档 www.kancloud.cn/ex ...

  8. quartz 两个java_spring boot整合quartz实现多个定时任务的方法

    最近收到了很多封邮件,都是想知道spring boot整合quartz如何实现多个定时任务的,由于本人生产上并没有使用到多个定时任务,这里给个实现的思路. 1.新建两个定时任务,如下: public ...

  9. Spring 3整合Quartz 2实现定时任务三:动态暂停 恢复 修改和删除任务

    前面我们已经完成了spring 3和quartz 2的整合以及动态添加定时任务,我们接着来完善它,使之能支持更多的操作,例如暂停.恢复.修改等. 在动态添加定时任务中其实已经涉及到了其中的一些代码,这 ...

  10. Spring 整合 Quartz 分布式调度

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

最新文章

  1. 刻意练习:LeetCode实战 -- 二叉树的后序遍历
  2. 颠覆认知了,公司 SRE 天天到底在干嘛?不会是重启工程师吧?
  3. 全球首例猪心移植人体手术:57岁晚期心脏病患者术后状况良好
  4. Py中的heapq模块【转载】
  5. PHP中this,self,parent的区别
  6. 22张图片倒叙霍金:我爱宇宙也爱这苦乐人生
  7. springboot+dubbo+nacos开发实战
  8. MySQL字符集问题
  9. 学计算机是为了什么演讲稿,求大学计算机协会职位申请书和演讲稿
  10. 谁为“上班玩耍”买单
  11. 维纳滤波的详细讲解(同为小白,相互取暖)
  12. POJ-1149(网络流)
  13. Feedforward Deep Networks(要点)
  14. PHP函数: set_time_limit
  15. SENT:Sentence-level Distant Relation Extraction via Negtive Training-ACL2021
  16. 【Codecs系列】X265编码器(六):lookahead模块分析
  17. 阿里巴巴(容器镜像服务)docker+springboot实践
  18. Ruby电子书教程、经典脚本合集
  19. YUV与RGB互转各种公式 (YUV与RGB的转换公式有很多种,请注意区别)
  20. Jenkins框架原理

热门文章

  1. 算法:回溯十二 Word Search字符串匹配二维矩阵
  2. 2021-09-1311. 盛最多水的容器 数组 双指针
  3. C++的类型转换操作符
  4. linux下安装xgboost
  5. python实现人形识别_100行Python代码实现人体肤色检测
  6. python3.8下载request_python3 requests 安装包下载安装[windows]
  7. 凸优化有关的数值线性代数知识 4分块消元与Schur补
  8. boost::filesystem使用手册
  9. 矩阵运算中的trick
  10. win10电脑显示无法自动修复此计算机,win10系统无法自动修复此计算机的操作步骤...