前言
spring boot进行定时任务一共有三种方式,第一种也就是最简单的一种:基于注解 (@Scheduled)的方式 ;第二种:基于接口 (SchedulingConfigurer) ;第三种:基于注解设定多线程定时任务 。
一、基于注解的方式
首先,打开idea,创建springboot项目,无需引入任何jar,springboot自带定时。
然后,在启动类中用注解@EnableScheduling进行标注,表明此类 存在定时任务。在定时执行的方法之上添加注解
点击启动,即可看到控制台6秒输出一次“hello”。
当然,定时任务也可以放在其他类中。例如创建类Task1。
然后可以看到控制台的输出结果:
图片
这里有个要注意的细节,就是启动类需要能扫描到定时任务类,否则定时任务启动不起来。不仅需要@Component注解,也需要将启动类位置位于定时任务类之上。如下图:
图片
笔者就是犯了这样的错,一直没启动起来。
@Scheduled除过cron还有三种方式:fixedRate,fixedDelay,initialDelay
cron:
fixedRate:
fixedRate:
initialDelay:
cron解释
cron
cron 用法跟linux下是一摸一样的,如果你搞过linux下的定时,那么必然很熟悉。
结构
cron表达式是一个字符串,分为6或7个域,每两个域之间用空格分隔,
其语法格式为:"秒域 分域 时域 日域 月域 周域 年域"
取值范围
常例
本方法的demo地址: https://github.com/SUST-MaZhen/scheduledTask.git
基于接口的方式
使用@Scheduled 注解很方便,但缺点是当我们调整了执行周期的时候,需要重启应用才能生效,这多少有些不方便。为了达到实时生效的效果,那么可以使用接口来完成定时任务,统一将定时器信息存放在数据库中。
在mysql中执行一下脚本插入定时任务:
创建一个springboot 项目:我们这里只添加一个mapper,不要bean也不要service以及controller,只是为了演示定时功能而已。demo结构:
图片
数据源基本配置:
mapper也就是dao:
task类:
运行结果:
图片
从结果中可以看出,是按照每6秒也就是数据库中查询的结果来进行的。
需求:我现在需要每10秒执行一次定时任务,该怎么办呢?对!只需要修改数据库值即可,server无需重启。观察修改后的结果。
图片
感觉好(。・∀・)ノ゙嗨哦。
demo地址:https://github.com/SUST-MaZhen/scheduledtask2.git
四、 基于注解设定多线程定时任务
前面讲到了@Scheduled执行周期任务会受到上次一个任务的执行时间影响。那么可以开启多线程执行周期任务。
创建springboot项目,创建一个多线程定时任务类如下:
执行结果如下:
图片
从结果可以看出:第一个任务的执行时间也不受其本身执行时间的限制。两个任务也互不影响。
demo地址: https://github.com/SUST-MaZhen/scheduledtash3.git
五、总结
本文介绍了spring boot创建定时任务的三种方式,当然还有其他方式,例如最近本的定时器来进行等等。