SpringBoot使用@Scheduled创建定时任务

定时任务一般会存在中大型企业级项目中,为了减少服务器、数据库的压力往往会采用时间段性的去完成某些业务逻辑。比较常见的就是金融服务系统推送回调,一般支付系统订单在没有收到成功的回调返回内容时会持续性的回调,这种回调一般都是定时任务来完成的。还有就是报表的生成,我们一般会在客户访问量过小的时候来完成这个操作,那往往都是在凌晨。这时我们也可以采用定时任务来完成逻辑。SpringBoot为我们内置了定时任务,我们只需要一个注解就可以开启定时为我们所用了。

本章目标

基于SpringBoot架构完成注解@Scheduled的定时任务配置。

构建项目

使用idea开发工具来构建SpringBoot项目,我们预先导入Web依赖,pom.xml如下图1所示:

Chapter26Application添加注解 @EnableScheduling,如下图2所示:
图2

可以看到上图2内我们添加注解后SpringBoot就已经认定了我们要使用定时任务来完成一些业务逻辑了,内部会对应原始配置定时任务添加对应的配置文件。

@Scheduled

@scheduled注解用来配置到方法上来完成对应的定时任务的配置,如执行时间,间隔时间,延迟时间等等,下面我们就来详细的看下对应的属性配置。

我们先来创建一个测试的定时任务实体,如下图3所示:

图3

上图3内的注解@Compoment用来标明这是一个被Spring管理的Bean,这个就不用多做讲解了。

                                                            图4
下面我们来配置 @Scheduled,来完成每小时的整10分钟输出内容,如上图4所示:

cron属性

@Scheduled(cron = "50 16 20 * * ?")
* 第一位,表示秒,取值0-59
* 第二位,表示分,取值0-59
* 第三位,表示小时,取值0-23
* 第四位,日期天/日,取值1-31
* 第五位,日期月份,取值1-12
* 第六位,星期,取值1-7,星期一,星期二...,注:不是第1周,第二周的意思 另外:1表示星期天,2表示星期一。
* 第7为,年份,可以留空,取值1970-2099
 
 
cron的一些符号:
(*)星号:可以理解为每的意思,每秒,每分,每天,每月,每年...
(?)问号:问号只能出现在日期和星期这两个位置,表示这个位置的值不确定,每天 3点执行,所以第六位星期的位置,我们是不需要关注的,就是不确定的值。同 时:日期和星期是两个相互排斥的元素,通过问号来表明不指定值。比如, 110日,比如是星期 1,如果在星期的位置是另指定星期二,就前后冲突矛盾了。
(-)减号:表达一个范围,如在小时字段中使用“ 10 -12”,则表示从 1012点,即 10, 11, 12
(,)逗号:表达一个列表值,如在星期字段中使用“ 1, 2, 4”,则表示星期一,星期二,星期四
( /)斜杠:如:x/y,x是开始值,y是步长,比如在第一位(秒) 0/ 15就是,从 0秒开始,每 15秒,最后就是 015304560 另:* /y,等同于0/y
cron此属性通常是六个参数(50:秒,16:分钟,20:小时,* *:月年)

这是一个时间表达式,可以通过简单的配置就能完成各种时间的配置,我们通过CRON表达式几乎可以完成任意的时间搭配,它包含了六或七个域:

Seconds : 可出现", - * /"四个字符,有效范围为0-59的整数
Minutes : 可出现", - * /"四个字符,有效范围为0-59的整数
Hours : 可出现", - * /"四个字符,有效范围为0-23的整数
DayofMonth : 可出现", - * / ? L W C"八个字符,有效范围为0-31的整数
Month : 可出现", - * /"四个字符,有效范围为1-12的整数或JAN-DEc
DayofWeek : 可出现", - * / ? L C #"四个字符,有效范围为1-7的整数或SUN-SAT两个范围。1表示星期天,2表示星期一, 依次类推
Year : 可出现", - * /"四个字符,有效范围为1970-2099年

下面简单举几个例子:

"0 0 12 * * ?"    每天中午十二点触发
"0 15 10 ? * *"    每天早上10:15触发
"0 15 10 * * ?"    每天早上10:15触发
"0 15 10 * * ? *"    每天早上10:15触发  //此方法不行(只支持6个参数,此处有7个)
"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 ? 3 WED"    三月的每周三的14:10和14:44触发
"0 15 10 ? * MON-FRI"    每个周一、周二、周三、周四、周五的10:15触发

fixedRate属性

该属性的含义是上一个调用开始后再次调用的延时(不用等待上一次调用完成),这样就会存在重复执行的问题,所以不是建议使用,但数据量如果不大时在配置的间隔时间内可以执行完也是可以使用的。配置示例如下图5所示:

图5

可以看到上图5内我配置的间隔时间是1秒,我在方法内使用了线程休眠,我们来测试下间隔输出的时间是多少,下面我们来启动项目,并且查看控制台输出内容。


项目成功启动后查看控制台内容如下图6所示:

图6

我们可以看到每一次打印的间隔都是2秒钟,也就是我们配置线程休眠的时间,很好的证实了该方法并没有等到执行完再开始下一次执行。

fixedDelay属性

该属性的功效与上面的fixedRate则是相反的,配置了该属性后会等到方法执行完成后延迟配置的时间再次执行该方法。配置示例如下图7所示:

图7

我们重启下项目后查看控制台输出(因为方便查看把之前配置的注解都已经注释掉),输出内容如下图8所示:

图8

可以看到上图8内的输出内容,时间间隔是4秒钟,我们在方法内仅仅使线程休眠了3秒钟,配置方法的延迟执行时间则是1秒钟,证明了确实是在方法执行完成后延迟配置时间后再次执行该方法。

initialDelay属性

该属性跟上面的fixedDelay、fixedRate有着密切的关系,为什么这么说呢?该属性的作用是第一次执行延迟时间,只是做延迟的设定,并不会控制其他逻辑,所以要配合fixedDelay或者fixedRate来使用,配置示例图下图9所示:

图9

我们再次重启项目,查看控制台输出,这次我们等待了10秒钟后才看到了第一次输出内容,如下图10所示:

图10

可以看到上图10内红色部分,项目成功启动的时间为23:02:06而第一次输出的时间则是23:02:16,证明了我们配置的延迟时间生效了。第一次加载完成后之后就是每间隔2秒钟执行一边该方法。

注意上面所有属性的配置时间单位都是毫秒,可根据项目中实际情况进行时间单位换算

总结

上述内容就是本章的所有讲解内容,本章主要讲解了SpringBoot项目内的定时任务如果配置使用,上述的属性是我们实际项目中最常用到的,可根据项目实际情况进行选择配置。



作者:jinyang
链接:https://www.jianshu.com/p/c7492aeb35a1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值