Spring(五):TaskScheduled任务调度与Cron表达式

Spring提供计划任务实现的注解,使用非常简单。首先通过配置类注解(@EnableScheduling)开启对计划任务的支持,然后在方法上注解(@Scheduled)申明这是一个计划任务。

@EnableScheduling开启调度

1
2
3
4
5
@Configuration
@ComponentScan("com.spring.scheduled")
@EnableScheduling//开启对计划任务的支持
public class TaskSchedulerConfig {
}

@Scheduled声明计划任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.text.SimpleDateFormat;
import java.util.Date;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

@Service
public class ScheduledTaskService {

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

/**
* 定时任务方法
*/
// @Scheduled(fixedRate=5000)
@Scheduled(cron="0/5 * * * * ? ")
public void reportCurrentTime() {
System.out.println("每隔五秒报一次时:" + dateFormat.format(new Date()));
}
}
  1. 运行
    1
    2
    3
    4
    5
    6
    7
    8
    9
    import 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
2
second minute hour day-of-month month day-of-week Year
second minute hour day-of-month month day-of-week

Spring Scheduled Cron

域取值

是否必需 允许通配符 有效范围(数字为整数)
秒(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-7MON-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-monthday-of-week两个域
注意:day-of-monthday-of-week 会相互影响。
当其中一个指定值后,另一个域值需设置为?

例如,想在每月的20日触发调度,不管20日是星期几,只能使用如下写法: 0 0 0 20 * ?
L 单词Last的首字母,表示最后一天。
仅用于day-of-monthday-of-week两个域
在日期域中,L表示某个月的最后一天。
在星期域中,L表示一个星期的最后一天,也就是星期日(SUN)。
如果在L前有具体的内容,例如,在星期域中的6L表示这个月的最后一个星期六。
W 表示有效工作日(周一到周五),只能出现在 day-of-month 域。
在离指定日期的最近的有效工作日触发事件。
W字符寻找最近有效工作日时不会跨过当前月份
LWLW 字符连用,
表示指定月份的最后一个工作日,
即指定月份的最后一个星期五。
例如:在 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 * * * *)

参考文档

  1. org.springframework.scheduling.support.CronExpression
  2. Spring 官方:Cron Expressions
  3. 阿里云官方:Cron表达式

Spring(五):TaskScheduled任务调度与Cron表达式

http://blog.gxitsky.com/2018/05/22/Spring-05-TaskScheduled-Cron/

作者

光星

发布于

2018-05-22

更新于

2022-12-05

许可协议

评论