概述
在开发过程中经常要用到定时任务,来执行一些特定程序。而 Java(Spring) 可以方便的使用 cron 表达式来实现定时任务。
本文将简单介绍 cron 表达式,并且对常用的定时任务场景,给出对应的 cron 表达式,相信能为你节省一些资料查找的时间。
CRON表达式简介
CRON表达式是一个字符串,在 Java(Spring) 中包含6个由空格分隔的字段,表示一组时间,通常作为执行某个程序的时间表。
以 Java(Spring) 为例说明:
* * * * * *
上面的表达式有6个字段,从第1个到第6个字段,分别表示:秒、分钟、小时、Day of month、月份、Day of week。
字段 | 是否必填 | 允许值 | 允许特殊字符 | 备注 |
---|---|---|---|---|
秒 | 是 | 0-59 | *,- | |
分钟 | 是 | 0-59 | *,- | |
小时 | 是 | 0-23 | *,- | |
Day of month | 是 | 1-31 | *,-? | |
月份 | 是 | 1-12 | *,- | |
Day of week | 是 | 0-7 | *,-? | 0和7为周日 |
逗号 用于分隔列表。例如,在 Day of week 字段中,1,3,6
表示周一、周三和周六。
连字符 定义范围。例如,在 Day of month 字段中,15-20
表示15号至20号期间的天,包含15号和20号。
常见场景
每15分钟执行一次
0 0/15 * * * ?
每天凌晨2点执行一次
0 0 2 * * ?
每天上午10点和晚上10点分别执行一次
0 0 10,22 * * ?
每周星期天23点59分执行一次
0 59 23 * * 7
每月最后一天的23点执行一次
0 0 18 28-31 * ?
一个月最少有 28 天,最多 31 天,所以天数那一项填的是 28-31。
如果一个月有31天,上面的表达式会导致 28,29,30,31号都会执行一次,所以还需要结合下面的代码来保证每个月只执行一次,
@Scheduled(cron = "0 0 18 28-31 * ?")
public void doAtLastDayOfMonth() {
final Calendar calendar = Calendar.getInstance();
if (c.get(Calendar.DATE) == c.getActualMaximum(Calendar.DATE)) {
// do something
}
}