问题小记(二):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

问题小记(二):Spring @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使用的是crontab表达式,和cron表达式不太一样。 cron表达式中1-7=周日-周六,crontab中0-6=周日-周六,区别还是挺明显的,这个知识我还真不太懂学到了。

上一篇:@Scheduled定时器使用@Transactional事物问题


下一篇:asp.net mvc 微信公众号token验证