Spring(五):TaskScheduled任务调度与Cron表达式
Spring提供计划任务实现的注解,使用非常简单。首先通过配置类注解(@EnableScheduling
)开启对计划任务的支持,然后在方法上注解(@Scheduled
)申明这是一个计划任务。
@EnableScheduling开启调度
1 |
|
@Scheduled声明计划任务
1 | import java.text.SimpleDateFormat; |
- 运行
1
2
3
4
5
6
7
8
9import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SchedulerMain {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(TaskSchedulerConfig.class);
}
}
@Scheduled 8种属性
注解包含 8 种可用的属性:
- cron:指定cron表达式
- zone:默认使用服务器默认时区。可以设置为
java.util.TimeZone
中的zoneId
- fixedDelay:从上一次任务完成到下一次任务开始的间隔,单位 毫秒
- fixedDelayString:同上,时间值是 String 类型
- fixedRate:从上一次任务开始到下一次任务开始的间隔(两次调用之间以毫秒为单位的固定周期),单位 毫秒
- fixedRateString:同上,时间值是 String 类型
- initialDelay:任务首次执行延迟的时间,单位毫秒
- initialDelayString:同上,时间值是 String 类型
Cron表达式
Cron
表达式是一个具有时间含义的字符串,字符串以 56 个空格隔开,分为 67 个域,每一个域代表一个含义,最后一个代表年份的域非必须,可省略。
单个域有多个取值时,使用半角逗号 ,
分隔取值。每个域可以是确定的取值,也可以是具有逻辑意义的特殊字符。每个域最多支持一个前导零。
Cron 有如下两种语法格式:
1 | second minute hour day-of-month month day-of-week Year |
域取值
域 | 是否必需 | 允许通配符 | 有效范围(数字为整数) |
---|---|---|---|
秒(second) | 是 | , - * / |
0-59 |
分钟(minute) | 是 | , - * / |
0-59 |
时钟(hour) | 是 | , - * / |
0-23 |
日期(day-of-month) | 是 | , - * / ? L W |
0-31 |
月份(month) | 是 | , - * / |
1-12 或 JAN-DEC |
星期(day-of-week) | 是 | , - * / ? L # |
0-7 或 MON-SUN 0 或 7 表示星期天 1 表示星期一,2表示星期二,依次类推 |
年(year) | 否 | , - * / |
1970-2099 年,空为当前年份 |
特殊字符
Cron表达式中的每个域都支持一定数量的特殊字符,每个特殊字符有其特殊含义。
特殊字符 | 含义 | 备注 |
---|---|---|
* |
所有可能的值。 | 例如,在 minute 域使用 * , 即表示每分钟都会触发事件。 |
, |
列出枚举值值。 | 例如,在 minute 域使用 5,20,则意味着在 5 和 20 分钟触发一次。 |
- |
范围。 | 例如,在 minute 域使用 5-20,表示从 5 分到 20 分钟每一分钟触发一次。 |
/ |
指定数值的增量。 | 表示起始时间开始触发,然后每隔固定时间触发一次, 例如,在 minute 域使用5/20,表示第5分钟开始,每 20 分钟触发一次。 |
? |
不指定值。 仅用于 day-of-month 和 day-of-week 两个域 |
注意:day-of-month 和 day-of-week 会相互影响。当其中一个指定值后,另一个域值需设置为 ? 例如,想在每月的20日触发调度,不管20日是星期几,只能使用如下写法: 0 0 0 20 * ? |
L |
单词Last的首字母,表示最后一天。 仅用于 day-of-month 和 day-of-week 两个域 |
在日期域中,L 表示某个月的最后一天。在星期域中, L 表示一个星期的最后一天,也就是星期日(SUN )。 如果在 L 前有具体的内容,例如,在星期域中的6L 表示这个月的最后一个星期六。 |
W |
表示有效工作日(周一到周五),只能出现在 day-of-month 域。在离指定日期的最近的有效工作日触发事件。 W 字符寻找最近有效工作日时不会跨过当前月份LW 是 L 和 W 字符连用,表示指定月份的最后一个工作日, 即指定月份的最后一个星期五。 |
例如:在 day-of-month 使用 5W ,如果5日是星期六,则将在最近的工作日星期五,即4日触发。 如果5日是星期天,则将在最近的工作日星期一,即6日触发。 如果5日在星期一 到星期五中的一天,则就在5日触发。 |
# |
用于确定每个月第几个星期几,只能出现在 DayofMonth 域。 |
例如,在星期域中,4#2 表示某月的第二个星期四。 |
示例值
以下为Cron表达式的取值示例。
示例 | 说明 |
---|---|
0 0 * * * * |
每天 0 点执行任务 |
0 15 10 ? * * |
每天上午10:15执行任务 |
0 15 10 * * ? |
每天上午10:15执行任务 |
0 0 12 * * ? |
每天中午12:00执行任务 |
0 0 6,19 * * * |
每天上行 6:00 和下午7:00 执行 |
0 0 10,14,16 * * ? |
每天上午10:00点、下午14:00以及下午16:00执行任务 |
*/10 * * * * * |
每 10 秒执行任务 |
0 0 8-10 * * * |
每天 8, 9 和 10 点执行任务 |
0 0/30 9-17 * * ? |
每天上午09:00到下午17:00时间段内每隔半小时执行任务 |
0 * 14 * * ? |
每天下午14:00到下午14:59时间段内每隔1分钟执行任务 |
0 0-5 14 * * ? |
每天下午14:00到下午14:05时间段内每隔1分钟执行任务 |
0 0/5 14 * * ? |
每天下午14:00到下午14:55时间段内每隔5分钟执行任务 |
0 0/5 14,18 * * ? |
每天下午14:00到下午14:55、 下午18:00到下午18:55时间段内每隔5分钟执行任务 |
0 0 12 ? * WED |
每个星期三中午12:00执行任务 |
0 15 10 15 * ? |
每月15日上午10:15执行任务 |
0 15 10 L * ? |
每月最后一日上午10:15执行任务 |
0 15 10 ? * 6L |
每月最后一个星期六上午10:15执行任务 |
0 15 10 ? * 6#3 |
每月第三个星期六上午10:15执行任务 |
0 10,44 14 ? 3 WED |
每年3月的每个星期三下午14:10和14:44执行任务 |
0 15 10 ? * * 2022 |
2022年每天上午10:15执行任务 |
0 15 10 ? * * * |
每年每天上午10:15执行任务 |
0 0/5 14,18 * * ? 2022 |
2022年每天下午14:00到下午14:55、 下午18:00到下午18:55时间段内每隔5分钟执行任务 |
0 15 10 ? * 6#3 2022,2023 |
2022年至2023年每月第三个星期六上午10:15执行任务 |
0 0/30 9-17 * * ? 2022-2025 |
2022年至2025年每天上午09:00到下午17:30时间段内每隔半小时执行任务 |
0 10,44 14 ? 3 WED 2022/2 |
从2022年开始,每隔两年3月的每个星期三下午14:10和14:44执行任务 |
宏注解
为了提高可读性,Spring支持以下宏,这些宏表示常用的序列。例如:@Scheduled(cron=“@hourly”)
。
Macro | Meaning |
---|---|
@yearly (or @annually ) |
once a year (0 0 0 1 1 * ) |
@monthly |
once a month (0 0 0 1 * * ) |
@weekly |
once a week (0 0 0 * * 0 ) |
@daily (or @midnight ) |
once a day (0 0 0 * * * ), or |
@hourly |
once an hour, (0 0 * * * * ) |
参考文档
- org.springframework.scheduling.support.CronExpression
- Spring 官方:Cron Expressions
- 阿里云官方:Cron表达式
Spring(五):TaskScheduled任务调度与Cron表达式
http://blog.gxitsky.com/2018/05/22/Spring-05-TaskScheduled-Cron/