文档章节

Spring与Quartz使用说明

卢瑶
 卢瑶
发布于 2014/11/20 14:52
字数 1823
阅读 35
收藏 0
点赞 0
评论 0

第一次完整做个项目或者说是模块功能,项目后台需要使用两个定时任务,每半个小时监控客户下的订单和注册两个任务,查看订单或注册数是否在正常。

Quartz官方网址:http://www.quartz-scheduler.org/ 

集成方法

集成起来比较简单,对线程无需任何理解,Spring手册上也有清楚的说明。只需写一个POJO,其余的都是配置,而且若使用CronTriggerBean,可以配置很复杂的任务调度。


1.编写一个普通的JAVA类

根据业务,写一个简单的JAVA类,和普通的类没有区别。并配置到Spring IOC配置文件上中,类中的参数使用property setting实现注入。例:

 <bean id="vcSMSProcessService" class="com.sinoprof.vc.sms.service.impl.MessageProcessServiceImpl">
        <property name="vcSMSLocalDAO" ref="vcSMSLocalDAO"/>
        <property name="vcSMSOAService" ref="vcSMSOAService"/>
        <property name="vcSMSConfig" ref="vcSMSConfig"/>
        <property name="vcSMSGateWayService" ref="vcSMSGateWayService"/>
    </bean>

2.使用MethodInvokingJobDetailFactoryBean建立任务

只需要配置即可,配置信息示例如下:

<bean id="jobTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject">
            <ref bean="vcSMSProcessService"/>
        </property>
        <property name="targetMethod">
            <value>sendMessages</value>
        </property>
        <property name="concurrent">
            <value>false</value>
        </property>
</bean>

 

说明:

targetObject

目标对象,即需要定时执行的POJO

targetMethod

目标方法,即需要定时执行的POJO方法

concurrent

默认情况下,Quartz Jobs是无状态的,可能导致jobs之间互相的影响,如果你为相同的JobDetail指定两个Trigger,很可能当第一个job完成之前,第二个job就开始了。如果Jobdetail实现了Stateful接口,就不会发生这样的事情。第二个job将不会在第一个job完成之前开始。为了使得jobs不并发运行,设置concurrent标记为false,如果是两个不同的任务,需要同时执行,则可以删除concurrent属性设置。

 

3.使用CronTriggerBean建立规则,调度任务

<bean id="jobTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail">
            <ref bean="jobTask"/>
        </property>
        <property name="cronExpression">
            <value>0 0/5 8-18 ? * 2-6 *</value>
        </property>
    </bean>

说明:

jobDetail

任务详情,即所需要调度的任务

cronExpression

调用规则,即什么时候调用。详细说明见附录1

 

4.使用SchedulerFactoryBean包装任务,

如果在一个quartz.xml文件中配置有多个任务,可在<list>中添加<ref bean = "">行

如果多个quartz文件配置多个任务,注意:SchedulerFactoryBean的id名设置不同名字,否则两个应同时执行任务出现不会并发的现象,其中一个任务不会执行。

<bean id="startQuartz" lazy-init="false" 
          class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="jobTrigger"/>
            </list>
        </property>
        <property name="autoStartup" value="true"/>
        <property name="schedulerName" value="cronScheduler"/>
    </bean>

说明:

triggers

触发器,调用哪些任务

autoStartup

是否自动启动,该Bean被初始化后是否自动启动定时任务。

Set whether to automatically start the scheduler after initialization. 

schedulerName

给这个计划设定一个名称。

Set the name of the Scheduler to fetch from the SchedulerFactory. 

 


更多使用细节可以参考Spring文档和Quartz文档


附录1:CronTrigger说明


如果需要复杂的任务计划调度,像日历样式的任务,而不是简单的时间间隔调度,需要使用CronTrigger,SimpleTrigger满足不了需求。


用CronTrigger,你可以定义任务计划像“每周五的中午”,或“每个工作日的早上9:30”,甚至可以定义“1月份的每周一、周三、周五早上9:00至10:00,每5分钟一次”。


虽然如此,像SimpleTrigger一样,CronTrigger仍有startTime属性定义计划的开始时间,endTime(可选)属性定义计划的中止时间。


Cron Expressions

Cron-Expressions是用来配置CronTrigger实例。Cron-Expressions是由七段子表达式组成的字符串,描述各个细节计划。这些子字符串由空格分开,每个子字符串表示一个域,分别为:


1 秒

2 分

3 时

4 几号

5 月份

6 星期几

7 年(可选域)

例如:"0 0 12 ? * WED"-表示每周三12:00:00pm"。


其中每个独立的子表达式都可以用范围或者列表表示。例如:


前例的”WED“也可以写成:


"MON-FRI"(范围表示)


"MON,WED,FRI"(列表表示)


"MON-WED,SAT"(范围加列表)


通配符(*)可以用来表示某个子表达式域的每一个可能的值。因此,“*”号用在月份里,表示每月。用在星期几里,表示一周中的每天。


每个子表达式域都有一组有效的值,这些值都是显然意见的。例:用0-59表示秒和分,用0到23表示小时。几号用0-31中的任何值,但是要小心每月的天数。月份指定的值应该是0至11,也可以用字符串 JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV和DEC表示。星期几用1到7表示(1=星期天),或用英文字符表示:SUN,MON,TUE,WED,THU,FRI和SAT。


字符“/”用来表示增量的值。例如:如果用“0/15”表示分,就表示从一个小时的0分开始,在这小时内每隔15分钟一次。如果用"3/20"表示分,则表示从一个小时的3分开始,在这小时内每隔20分钟一次。也可以用“3,23,43”表示。注意"*/35"并不是表示每35分钟,而是表示从一个小时的0分开始,每隔35分钟一次,相当于"0,35"。


“?"号允许用在几号和星期几的子字符串域中,用来说明没有指定值。


“L”字符允许用在几号和星期几域中,是"last"的缩写。“L”用在几号里意思是这个月的最后一天,如果是1月就指31号,如果是闰年的2月就是28号。如果用在星期几里,他就是表示“7”或者“SAT”(星期六)。但是如果L用在一个值的后面联合表示星期几域,就表示“这个月最后一个星期几”。例如:“6L”或“FRIL”表示这个月的最后一个星期五。同样也可以用一个偏移变量表示距离某个月最后一天的天数。例如:“L-3”表示某月最后一天的倒数第三天。但用“L“字符时,不要将“L”用在列表或范围中,那样你会混淆或者获得不是预期的结果。


“W”用来指定某一号最近的工作日(星期一至五),例如:“15W”放在几号里,表示这个月15号最近的一个工作日。


“#”号用指定某月第几个工作日,例如:“6#3”或“FRI#3”放在星期几域中,表示这个月第三个星期五。


下面是一些表达式的样例,你可以从JavaDoc中找到更多的例子。


Cron Expressions示例

例1-一个表达式表示每5分钟。


"0 0/5 * * * ?"


例2——表示每分钟的10秒后,每5钟一次(如:10:00:10 am,10:05:10 am,等等)


"10 0/5 * * * ?"


例3——表示运行在每个星期三,星期五的10:30,11:30,12:30 and 13:30


"0 30 10-13 ? * WED,FRI"


例4——表示每月的5号和20号的早8点至早10点每30分钟一次。


"0 0/30 8-10 5,20 * ?"


注意,有些计划调度需求如果用一个触发器会很复杂,例如:“早9:00至10:00每5分钟,下午1:00至10:00每20分钟”,这种情况下可以是单的创建两个触发器同时运行一个JOB


© 著作权归作者所有

共有 人打赏支持
卢瑶
粉丝 13
博文 76
码字总数 44827
作品 0
徐汇
程序员
沈晓军/LarvaFrame

LarvaFrame - 介绍&使用说明 sxjun @2016-01-29 该版本已经不再更新。 一、LarvaFrame介绍 LarvaFrame是一个权限管理系统,以SpringMvc+MiniJdbc+Shiro+MySQL+MQ+Redis+Flappy+Maven为架构,...

沈晓军 ⋅ 2016/01/30 ⋅ 0

Spring Boot--自定义Starter之spring-boot-starter-quartz

痛点 在Spring中使用计划任务,有两种方案可供选择:一、用Spring原生的计划任务,使用起来非常简单,只需要用到@Scheduled注解即可;二、集成Quartz来做计划任务,需要配置大量的Quartz原生...

大大枣 ⋅ 04/03 ⋅ 0

spring+quartz 定时器使用

项目使用:spring+springMVC+JPA+Maven 1、在pom.xml中引用quartz的jar包 <!-- quartz --><dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version......

杀丶破狼 ⋅ 2015/10/13 ⋅ 1

spring3升级spring4注意事项

前两天,把spring版本升级到了4,这里写一下注意事项: 1,加入spring-context-support,以前3的版本不用加,但是4要加上,否则就会报ClassNotFoundException, 2,更换springmvc jackson依赖...

四月李 ⋅ 2016/08/26 ⋅ 0

Spring学习——Spring MVC 中定时器实现

在一些工作需要使用到定时器,Spring很好的集成了定时器的功能! 在Spring 中使用Quartz,本文介绍Spring3.0以后自主开发的定时任务工具,spring task,可以将它比作一个轻量级的Quartz,而且...

IT达仁 ⋅ 05/10 ⋅ 0

推荐几个自己写的Java后端相关的范例项目(转载)

http://wosyingjun.iteye.com/blog/2312553 这里推荐几个自己写的范例项目,主要采用SSM(Spring+SpringMVC+Mybatis)框架,分布式架构采用的是(dubbo+zookeeper)。范例项目的好处是简单易...

指尖的舞者 ⋅ 2016/09/27 ⋅ 0

SpringMVC 中的Controller返回JSON数据

SpringMVC中的Controller返回JSON问题 ①配置JSON解析器 ②使用注解@ResponseBody返回的是json,没有使用该注解,则会进行页面跳转。 方案一

IamOkay ⋅ 2014/11/21 ⋅ 0

抽离。/FzqBlog

交流社区 使用spring + springmvc + mybatis + quartz + freemarker 使用spring aop + 自定义注解实现细粒度到按钮级别的轻量级权限控制 使用quartz定时统计数据采用echart展示 集成极验验证...

抽离。 ⋅ 2017/03/06 ⋅ 0

Java Web定时任务这一篇就够了

一、Java定时任务 1、Timer 包下面一个工具类,从1.3开始便支持了; 说明下后两个参数分别是delay延迟执行,和period执行间隔,单位都是毫秒。 2、ScheduledExecutorService 包下面,从1.5开...

叫我宫城大人 ⋅ 04/16 ⋅ 0

SpringMVC 4 计划任务使用包依赖?

我了解以前SpringMVC 3的计划任务 Quartz的使用方式,现在尝试迁移架构到Spring 4中,查看网络配置为 但是task表示没有找到,请问应该依赖什么包,我看到官网让我依赖一个spring-boot-start...

抢小孩糖吃 ⋅ 2014/05/12 ⋅ 6

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 58分钟前 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 2

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部