【cron定时配置】简洁教程以及通配符的搭配使用

最近几个月写了几个定时任务,简略学习了一下cron定时通配符。
发现现在能找到的博客教学都局限于“能用”的程度。于是决定根据实际使用的情况总结一下,主要是通配符的各种使用情况。
毕竟只是简单学习,很多地方可能用词不是很严谨,还请多多担待。

首先是cron表达式的语法:
参考文章——cron定时通配符
格式: [秒] [分] [小时] [日] [月] [周] [年]
各位置可用值以及通配符,我写成了表格的形式,更直观一些
各位置可用值以及通配符,我写成了表格的形式,更直观一些。
顺带一提,周和月这两个地方的值可以用“JAN-DEC、SUN-SAT”代替,不过还是希望大家可以善待自己也善待别人。直接用数字就好了。

而“周”可填写的值,从周日开始,即 0 0 18 ? * 1 为每周日的18点,从周日开始。 需要修改为 0 0 18 ? * 2 才为每周一18点。

我这里推荐一个网站,可以用来测试cron语句的结果。遇到不确定的可以先到这个网站测试一下结果。
https://www.bejson.com/othertools/cron/

基础语法学会了,接下来是关于通配符的搭配使用

, 逗号

能被应用于每一个位置,用于指定多个值。可以和除“*”和“L”以外的所有符号搭配使用

如: 0 0 18,19 * * ? 结果为每天18,19点触发

运行结果:

  • 2022-01-12 18:00:00
  • 2022-01-12 19:00:00
  • 2022-01-13 18:00:00
  • 2022-01-13 19:00:00
  • 2022-01-14 18:00:00
  • 2022-01-14 19:00:00
  • 2022-01-15 18:00:00
  • 2022-01-15 19:00:00

- 减号

能被应用于每个位置,用于指定一个区间的值

如: 0 0 18-20 * * ? 结果为每天18点到20点

运行结果:

  • 2022-01-12 18:00:00
  • 2022-01-12 19:00:00
  • 2022-01-12 20:00:00
  • 2022-01-13 18:00:00
  • 2022-01-13 19:00:00
  • 2022-01-13 20:00:00
  • 2022-01-14 18:00:00
  • 2022-01-14 19:00:00

可以和逗号搭配使用

如: 0 0 12-14,18-20 * * ? 结果为每天12点到14点和18点到20点

运行结果:

  • 2022-01-12 12:00:00
  • 2022-01-12 13:00:00
  • 2022-01-12 14:00:00
  • 2022-01-12 18:00:00
  • 2022-01-12 19:00:00
  • 2022-01-12 20:00:00
  • 2022-01-13 12:00:00
  • 2022-01-13 13:00:00

* 星号

能被应用于每个位置,用于指定所有的值

这就没什么好说的了。
如: 0 0 * * * ? 就是每一天的每一个小时

/ 除号

能被应用于每个位置,用于指定相同间隔的值

格式为:[起始值]/[间隔值]
比如 “分” 可取的值0-59。那么 10/4 就是 10、14、18、22、26.
也就是从起始值开始,逐次递增间隔值。直到到达上限为止。

也因此,周的可取值为1-7.没法通过0 0 18 ? * 2/14指定每过两周的周一18点。因为递增后的值超出了可取值的上限

如: 0 10/4 1 13 * ?

运行结果:

  • 2022-01-13 01:10:00
  • 2022-01-13 01:14:00
  • 2022-01-13 01:18:00
  • 2022-01-13 01:22:00
  • 2022-01-13 01:26:00
  • 2022-01-13 01:30:00
  • 2022-01-13 01:34:00
  • 2022-01-13 01:38:00

同样也可以和逗号搭配
如:0 10/4,10/5 * 13 * ?

运行结果:

  • 2022-01-13 00:10:00
  • 2022-01-13 00:14:00
  • 2022-01-13 00:15:00
  • 2022-01-13 00:18:00
  • 2022-01-13 00:20:00
  • 2022-01-13 00:22:00
  • 2022-01-13 00:25:00
  • 2022-01-13 00:26:00

? 问号

只能被“日”和“周”使用,而且二者之一必须为“?”,不能共存,表示忽略该值
因此cron是做不到指定日期的同时指定周数,只能指定其一。

L

只能被“日”和“周”使用
L就是 last(最后的)
也是字面意思,如果放在日就代表最后一天,放在周就代表最后一周。

最重要的是,L只能和W组合,和其他符号组合要么报错要么只会等同于L

不同在于使用的方法

如:0 0 0 L * ? 其中“L”就代表每个月最后一天

运行结果:

  • 2022-01-31 00:00:00
  • 2022-02-28 00:00:00
  • 2022-03-31 00:00:00
  • 2022-04-30 00:00:00
  • 2022-05-31 00:00:00
  • 2022-06-30 00:00:00
  • 2022-07-31 00:00:00
  • 2022-08-31 00:00:00

如:0 0 0 ? * 2L 其中“2L”代表每个月最后一个星期一

运行结果:

  • 2022-01-31 00:00:00
  • 2022-02-28 00:00:00
  • 2022-03-28 00:00:00
  • 2022-04-25 00:00:00
  • 2022-05-30 00:00:00
  • 2022-06-27 00:00:00
  • 2022-07-25 00:00:00
  • 2022-08-29 00:00:00

W

“日”专用,假如那天为休息日,则指向最近的工作日
这里的工作日只指周一到周五,不受法定假期影响

如:0 0 0 1W * ?

运行结果:

  • 2022-02-01 00:00:00
  • 2022-03-01 00:00:00
  • 2022-04-01 00:00:00
  • 2022-05-02 00:00:00
  • 2022-06-01 00:00:00
  • 2022-07-01 00:00:00
  • 2022-08-01 00:00:00
  • 2022-09-01 00:00:00

假如那天为周日,会延后指向周一。如果那天为周六,则指向周五。

特殊情况:
假如月初1、2号刚刚好为周六、周日。“1W”则会向后移动两天指向3号周一。
月末最后两天为周六、周日同理,“LW”会向前移动两天指向周五。

“L”还可以和“W”组合

如:0 0 0 LW * ? 代表每个月最后一天的工作日
不能写为“WL”

运行结果:

  • 2022-01-31 00:00:00
  • 2022-02-28 00:00:00
  • 2022-03-31 00:00:00
  • 2022-04-29 00:00:00
  • 2022-05-31 00:00:00
  • 2022-06-30 00:00:00
  • 2022-07-29 00:00:00
  • 2022-08-31 00:00:00

# 井号

“周”专用,代表第几个星期的星期几
格式: [周几]#[第几周]

如: 0 0 0 ? * 1#2 代表第二周的周日

运行结果:

  • 2022-02-13 00:00:00
  • 2022-03-13 00:00:00
  • 2022-04-10 00:00:00
  • 2022-05-08 00:00:00
  • 2022-06-12 00:00:00
  • 2022-07-10 00:00:00
  • 2022-08-14 00:00:00
  • 2022-09-11 00:00:00

最高为第五周,再高就会报错。
周数的计算方式为从1号开始,每七天循环为一周。
以2022年一月举例,第一周1-7号、第二周8-14号、第三周15-21号、第四周22-28号、第五周29-31号

那么 0 0 0 ? 1 1#5 就能得到第五周的周日也就是30号,
0 0 0 ? 1 3#5 就没法在2022年得到值了,因为第五周没有周二。

个人疑惑

cron语句如果写的过于绝对,锁定八个以下的时间,就会报错。
虽然按照定时器的特性,这种情况比较极端,但是假如我就是只需要在那一个特别指定的时间触发,就会是个大麻烦(虽然目前还没有遇到)一时间不知道这是故意为之的还是单纯的bug。

总之以上就是我关于cron语句的心得了,希望能够对你有所帮助。
如果有什么地方描述不够清晰或者有错误之处的话,可以留言告诉我,我看到了第一时间会去验证修改的。

以上,谢谢您。

在Spring Boot中,我们可以使用数据库配置cron表达式来完成定时任务。具体步骤如下: 1. 首先,在数据库中创建一个表来存储定时任务的相关信息,例如任务名称、cron表达式、任务类名等。 2. 创建一个定时任务服务类,用于从数据库中读取定时任务信息,并根据cron表达式执行相应的任务。 3. 在Spring Boot的配置文件中配置数据源和定时任务相关的属性,例如扫描定时任务的包路径、定时任务线程池大小等。 4. 在启动类中添加@EnableScheduling注解,开启定时任务的支持。 5. 在定时任务类中添加@Scheduled注解,并指定cron表达式,以及要执行的方法。 下面是一个示例代码,用于演示如何使用数据库配置cron表达式来完成定时任务: <<引用>> @Configuration @EnableScheduling public class ScheduledConfig { @Autowired private DataSource dataSource; @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler(); scheduler.setPoolSize(10); scheduler.setThreadNamePrefix("my-scheduled-task-pool-"); scheduler.setAwaitTerminationSeconds(60); scheduler.setWaitForTasksToCompleteOnShutdown(true); return scheduler; } @Bean public ScheduledTaskRegistrar scheduledTaskRegistrar() { ScheduledTaskRegistrar registrar = new ScheduledTaskRegistrar(); registrar.setTaskScheduler(taskScheduler()); registrar.setScheduler(taskScheduler()); registrar.setDataSource(dataSource); return registrar; } } @Component public class MyScheduledTask { @Scheduled(cron = "${my.task.cron}") public void doTask() { // do something } } 在上面的代码中,我们使用了@EnableScheduling注解来开启定时任务的支持,使用@Scheduled注解来指定cron表达式和要执行的方法。同时,我们还创建了一个ScheduledConfig类,用于配置定时任务线程池和数据源,以及一个ScheduledTaskRegistrar类,用于从数据库中读取定时任务信息并执行相应的任务。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值