我们先看下本节的大纲:
(1)定时任务的几种实现方式;
(2)spring task入门;
(3)cronexpression配置说明;
(4)cronexpression实例;
接下来我们看看具体的每个步骤:(1)定时任务的几种实现方式;
timer :java自带的java.util.timer类,这个类允许你调度一个java.util.timertask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
quartz :使用quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。
springtask :spring3.0以后自带的task,可以将它看成一个轻量级的quartz,而且使用起来比quartz简单许多。
(2)springtask入门;
再次我们编写一个简单的例子学习下定时器的简单应用:(a)新建一个spring-boot-task工程;
这个步骤很简单,不多说。(b)在pom.xml文件添加依赖,如下:
http://maven.apache.org/pom/4.0.0 xmlns:xsi=http://www.w3.org/2001/xmlschema-instance
xsi:schemalocation= http://maven.apache.org/pom/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd >
4.0.0
com.kfit
spring-boot-task2
0.0.1-snapshot
jar
spring-boot-task2
http://maven.apache.org
utf-8 1.8 org.springframework.boot spring-boot-starter-parent 1.4.1.release junit junit test org.springframework.boot spring-boot-starter-web (c)编写启动类,app.java:
package com.kfit;
import org.springframework.boot.springapplication;
**import **org.springframework.boot.autoconfigure.springbootapplication;
/**
@author angel --守护天使@version v.0.1@date 2017年3月26日*/
@springbootapplication
**public **class app {
**public ****static ****void** main(string[] args) { springapplication. *run* (app. **class** , args);}}
(c)编写定时任务调度类,mytask.java:
package com.kfit.task;
import java.util.date;
import org.springframework.context.annotation.configuration;
import org.springframework.scheduling.annotation.enablescheduling;
import org.springframework.scheduling.annotation.scheduled;
/**
@author angel --守护天使@version v.0.1@date 2017年3月26日*/
@configuration
@enablescheduling
**public **class mytask {
/** * 我们希望这个方法每10秒打印一次. * cron:定时任务表达式. * * 指定:秒,分钟,小时,日期,月份,星期,年(可选). * *:任意. * */@scheduled(cron=0/10 * ** * *)//@scheduled(cron=0/10* * * * ?)
**public ****void** tast1(){ system. ***out*** .println(mytask.tast1(),+**new** date());}/** * 我们希望这个方法每1分钟打印一次. */@scheduled(cron=0 0/1 * ** *)**public ****void** tast2(){ system. ***out*** .println(mytask.tast2(),+**new** date());}}
在这里有有一个地方需要特别说明下:mytask.tast1()
mytask.tast1()
mytask.tast1()
mytask.tast2()
mytask.tast1()
tast1: 每10秒打印1次.
task2: 每1分钟打印1次.
1分钟是60秒 = 没打印6次task1之后才能够打印1次task2.
spring task 在计算时间的时候,是根据当前服务器的系统时间进行计算.
如果是每10秒执行一次的话,那么它是从系统时间的0,10,20秒进行计算的.
如果是每1分钟执行一次的话,那么它是从系统时间的1分钟,2分钟进行计算的。
如果是这样的话,那么我会碰到这样的情况:就是当我们刚刚启动程序的时候,我们的时间
刚好是9:39:55秒,那么就会出现5秒之后会执行1次task1和1次task2.
(d)启动运行程序进行测试:
这个大家运行完之后关注下控制台的打印信息。(3)cronexpression配置说明;
字段允许值允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / lwc
月份 1-12 或者 jan-dec , - * /
星期 1-7 或者 sun-sat , - * ? / lc #
年(可选) 留空, 1970-2099 , - * /
特殊字符:
在cron表达式的时间字段中,除允许设置数值外,还能你使用一些特殊的字符,提供列表、范围、通配符等功能
星号(*)
可用在所有字段下,表示对应时间域名的每一个时刻,如*用在分钟字段,表示“每分钟”。
问号(?)
只能用在日期和星期字段,代表无意义的值,比如使用l设定为当月的最后一天,则配置日期配置就没有意义了,可用?作占位符的作用。
减号(-)
表示一个范围,如在日期字段5-10,表示从五号到10号,相当于使用逗号的5,6,7,8,9,10
逗号(,)
表示一个并列有效值,比如在月份字段使用jan,dec表示1月和12月
斜杠(/)
x/y表示一个等步长序列,x为起始值,y为增量步长值,如在小时使用1/3相当于1,4,7,10当时用*/y时,相当于0/y
l
l(last)只能在日期和星期字段使用,但意思不同。在日期字段,表示当月最后一天,在星期字段,表示星期六(如果按星期天为一星期的第一天的概念,星期六就是最后一天。如果l在星期字段,且前面有一个整数值x,表示“这个月的最后一个星期x”,比如3l表示某个月的最后一个星期二。
w
选择离给定日期最近的工作日(周一至周五)。例如你指定“15w”作为day of month字段的值,就意味着“每个月与15号最近的工作日”。所以,如果15号是周六,则触发器会在14号(周五)触发。如果15号是周日,则触发器会在16号(周一)触发。如果15号是周二,则触发器会在15号(周二)触发。但是,如果你指定“1w”作为day of month字段的值,且1号是周六,则触发器会在3号(周一)触发。quartz不会“跳出”月份的界限。
lw****组合
在日期字段可以组合使用lw,表示当月最后一个工作日(周一至周五)
井号(#)
只能在星期字段中使用指定每月第几个星期x。例如day of week字段的“6#3”,就意味着“每月第3个星期五”(day3=星期五,#3=第三个);“2#1”就意味着“每月第1个星期一”;“4#5”就意味着“每月第5个星期3。需要注意的是“#5”,如果在当月没有第5个星期三,则触发器不会触发。
c
只能在日期和星期字段中使用,表示计划所关联的诶其,如果日期没有被关联,相当于日历中的所有日期,如5c在日期字段相当于5号之后的第一天,1c在日期字段使用相当于星期填后的第一天
(4)cronexpression实例;
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 ? 3wed 三月的每周三的14:10和14:44触发
0 15 10 ? *mon-fri 每个周一、周二、周三、周四、周五的10:15触发
CES 2019:松下将加快开发强化新一代AI住宅
易络盟对EnOcean与IBM技术解读
如何选用合适的晶振
三星GalaxyA9s拆解 近年来内部结构最不像三星的三星手机
如何通过雅特力AT32WB415的蓝牙模块来实现ANCS的功能
从各个维度再次介绍Spring Boot定时任务调度
美的运动控制让机械采摘升级更优化
超声成孔成槽检测仪的说明
贴片电感如果坏掉了会有什么现象
出售Agilent E3646A可编程直流电源E3646A
MAX6070,MAX6071高精度串联电压基准
整流电路有哪几种
路由器的工作原理是什么?
变频器哪个牌子比较好_变频器厂家排名(国产)
三星S8比iPhone7更好用?那只是因为iphone8还没发布!
Intel第四代扩展处理器重拾双芯设计
干货!智能照明无线传输2种协议深度对比分析
欧盟开启新一轮电池扶持计划 为何来自亚洲的电池企业被排除在外
家用电器常用灭菌标准和测试方法
5G连接技术越来越重要,将成为全球经济发展的新动能