问题小记(二):Spring @Scheduled 星期定时任务没执行 浅篇
bug发生背景:经理安排bug发生背景:经理安排写一个定时任务每周五早上执行某业务逻辑,然而周五当天却没有执行。
当时任务要求为每周五早上八点半
执行业务程序,我通过cron在线表达式搜索到写法为:0 30 8 ? * 6
,这里最后一位特意从百度百科、oracle cron表达式 上查看到 最后一位1-7表示周日到周六(1是周日,2才是周一.....6是周五,7是周六),于是自信满满的表达式写进代码里了。
简化之后的代码大概是如下。只是使用了@Scheduled注解。
@Scheduled(cron = "0 30 8 ? * 6")
public void testDayOfWeek(){
// 业务逻辑
}
发现程序没有执行后,进行排查。先说结论:@Scheduled的cron并不是完全使用cron表达式,有一些细微的差距。@Scheduled注解使用的解析器官方文档里:crontab:
可以看到0/7是周末,5就是周五,6就是周六,或者换一种写法:SUN,MON,TUE,WED,THU,FRI,SAT
分别代表周日-周六,选择对应的英文。 例如周五早八点半就可以写成0 30 8 ? * FRI
。
结论:
每周五早上八点半在@Scheduled中写法:
@Scheduled(cron = "0 30 8 ? * 5")
@Scheduled(cron = "0 30 8 ? * FRI")
改好之后本地测试没问题已经发布好了。可以发现@Scheduled使用的是类似cron表达式,和cron不太一样。 cron表达式中1-7=周日-周六,crontab中0-6=周日-周六,区别还是挺明显的,这个知识我还真不太懂学到了。