头条的文章和视频支持定时发布,那么它的原理是什么样的呢,怎么做到到了指定时间立即发布,这其中用到了cron知识,它内部每秒都在扫描定时发布的文章,直到你的文章的时间触发条件,那么就即可发布。
SpringBoot定时任务
利用Spring自带的定时任务,几行代码即可搞定这样的需求
在方法中加入注解@Scheduled(cron = "0/1 * * * * ?")即可在指定的定时任务中执行对应的方法
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秒一次
- 每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次,依次类推
系统如果不需要集群的话,这种方式是最简单快速的,但是当前大部分系统都需要集群,所以一般我们不会采用这种方案,而是用单独定时任务分布式集群系统,否则会造成任务重复执行。