SpringBoot用注解快速搭建定时任务,测试各种cron表达

头条的文章和视频支持定时发布,那么它的原理是什么样的呢,怎么做到到了指定时间立即发布,这其中用到了cron知识,它内部每秒都在扫描定时发布的文章,直到你的文章的时间触发条件,那么就即可发布。

SpringBoot定时任务

利用Spring自带的定时任务,几行代码即可搞定这样的需求

在方法中加入注解@Scheduled(cron = "0/1 * * * * ?")即可在指定的定时任务中执行对应的方法

SpringBoot用注解快速搭建定时任务,测试各种cron表达

cron是计划执行任务的一种策略

Linux中的cron

Linux中自带cron服务,但是这个服务默认没有启动,可以设置为自启动。

Linux中的cron格式为M H D m d cmd,简言之就是“分钟 小时 自然月中的天 月 星期中的天 执行的命令”

它的最小单位是分钟,所以正常来说是没办法执行秒级的任务,因此比如头条的这种任务是无法执行的。

java中的cron

当然这种任务一般也不会用到Linux自带的cron服务,一般我们都是用程序中的定时任务,cron表达式。

比如java中spring调用的jdk自带的ScheduledExecutorService

cron表达式的格式是“秒 分 时 自然月的天 月 星期中的天 年”,可以根据这种策略执行秒级单位内的任何定时任务。

它的规则也是已经约束好的,比如

  • 秒:0到59的数字,*,逗号,-,/
  • 分:0到59的数字,*,逗号,-,/
  • 时:0到23的数字,*,逗号,-,/
  • 自然月的天:1到31的数字,*,逗号,-,/
  • 月:1到12的数字,*,逗号,-,/
  • 星期中的天:0到7的数字,*,逗号,-,/

其中

  • *代表任何数字
  • ,逗号代表多个数字的间隔符
  • -代表从几到几
  • /代表每隔多长时间触发一次
  • ?代表只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于占位符;
  • L:代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7
  • W:代表表示离该日期最近的工作日。比如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。

常见的任务类型:

  • 每秒钟执行一次:0/1 * * * * ?

这种常见于需要实时触发的异步任务,这里面的/就代表从0秒开始,每一秒执行一次。

  • 有个需要注意的0/50 * * * * ?

从0秒开始每50秒执行一次,那么它的执行时间就是0秒一次,50秒一次,紧接着下一秒的0秒一次,50秒一次,这样他们之间的间隔并不完全是50秒,这里指的是秒0到59的周期内,从0开始每50秒一次

SpringBoot用注解快速搭建定时任务,测试各种cron表达

  • 每5分钟执行一次:0 0/5 * * * ?

这里呢秒是0,然后分钟是从0开始每5分一次,也就是0分0秒一次,5分0秒1次依次类推

  • 5 0/5 * * * ? 0分5秒一次,5分5秒1次依次类推
  • * 0/2 * * * ? 0分内每秒一次执行60次,2分的时候每秒一次执行60次,依次类推
SpringBoot用注解快速搭建定时任务,测试各种cron表达

系统如果不需要集群的话,这种方式是最简单快速的,但是当前大部分系统都需要集群,所以一般我们不会采用这种方案,而是用单独定时任务分布式集群系统,否则会造成任务重复执行。



分享到:


相關文章: