前文:
1、Spring Task 是 Spring 提供的轻量级定时任务工具,也就意味着不需要再添加第三方依赖了,相比其他第三方类库更加方便易用。
2、spring task是spring 3.0以后推出的定时器类,可以把它当做一个轻量级的quartz。由于配置简单,功能齐全,在实际项目中经常会用到。spring task支持xml配置、注解配置、java配置三种方式。
注解配置的实现方式:
第一步,新建配置类 SpringTaskConfig,并添加 @EnableScheduling注解开启 Spring Task。
@Configuration
@EnableScheduling
public class SpringTaskConfig {
}
也可以不新建这个配置类,直接在主类上添加 @EnableScheduling 注解即可。
@SpringBootApplication
@EnableScheduling
public class CodingmoreSpringtaskApplication {
public static void main(String[] args) {
SpringApplication.run(CodingmoreSpringtaskApplication.class, args);
}
}
第二步,新建定时任务类 CronTask,使用 @Scheduled 注解注册 Cron 表达式执行定时任务。
@Slf4j
@Component
public class CronTask {
@Scheduled(cron = "0/1 * * ? * ?")
public void cron() {
log.info("定时执行,时间{}", DateUtil.now());
}
}
第三步,启动服务器端,发现每隔一秒钟会打印一次日志,证明 Spring Task 的 cron 表达式形式已经起效了,如下图。
关于 Cron 表达式:
1、含义:Cron 这个词来源于希腊语 chronos,原意也就是时间。
示例 | 说明 |
| 每天上午10:15执行任务 |
| 每天10 点、14 点、16 点执行任务 |
| 每个星期三中午 12 点执行任务 |
| 每月 15 日上午 10 点 15 执行任务 |
2、Cron 的语法格式可以总结为:
英文:Seconds Minutes Hours DayofMonth Month DayofWeek
中文:秒 分 时 每月的第几天 月 每周的第几天
3、每个时间元素的取值范围,以及可出现的特殊字符,如下表所示:
时间元素 | 取值范围 | 可出现的特殊字符 |
秒 |
|
|
分钟 |
|
|
小时 |
|
|
日期 |
|
|
月份 |
|
|
星期 |
|
|
4、特殊字符的含义和示例,如下表所示:
特殊字符 | 含义 | 示例 |
| 所有可能的值 | 用来表示所有值,可以理解成所有的值都执行,也就是“每”的意思,比如在秒的位置上输入 * 就表示每秒都运行 |
| 枚举的值 | 可以用来逗号隔开的多个时间点的并集,比如在月的位置上输入1,2表示在1月和2月都要执行 |
| 范围 | 用来表示一个时间段,一个连续触发的范围,比如在秒的位置上输入10-30表示在10到30秒间每秒执行一次 |
| 指定数值的增量 | 分钟域中 |
| 不指定值 | 它只用于周和日的域,避免周和日的冲突,用于周和日之间进行互斥。通常在周和日设置的一个值,另外一个用?表示不指定值。比如要在每月的1号触发一个动作,但忽略周几,我们可以这么设置成 0 0 0 1 * ? |
| 单词 Last 的首字母 | 日期域和星期域支持,表示月的最后一天或者星期的最后一天 |
| 除周末以外的工作日 | 仅日期域支持 |
| 每个月的第几个星期几 | 仅星期域支持, |
5、例子:
*/5 * * * * ? 每隔 5 秒执行一次
0 */1 * * * ? 每隔 1 分钟执行一次
0 0 2 1 * ? * 每月 1 日的凌晨 2 点执行一次
0 15 10 ? * MON-FRI 周一到周五每天上午 10:15 执行作业
0 15 10 ? 6L 2002-2006 2002 年至 2006 年的每个月的最后一个星期五上午 10:15 执行作业
0 0 23 * * ? 每天 23 点执行一次
0 0 1 * * ? 每天凌晨 1 点执行一次
0 0 1 1 * ? 每月 1 日凌晨 1 点执行一次
0 0 23 L * ? 每月最后一天 23 点执行一次
0 0 1 ? * L 每周星期天凌晨 1 点执行一次
0 26,29,33 * * * ? 在 26 分、29 分、33 分执行一次
0 0 0,13,18,21 * * ? 每天的 0 点、13 点、18 点、21 点都执行一次
0 0 10,14,16 * * ? 每天上午 10 点,下午 2 点,4 点执行一次
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时执行一次
0 0 12 ? * WED 每个星期三中午 12 点执行一次
0 0 12 * * ? 每天中午 12 点触发
0 15 10 ? * * 每天上午 10:15 触发
0 15 10 * * ? 每天上午 10:15 触发
0 15 10 * * ? * 每天上午 10:15 触发
0 15 10 * * ? 2005 2005 年的每天上午 10:15 触发
0 * 14 * * ? 每天下午 2 点到 2:59 期间的每 1 分钟触发
0 0/5 14 * * ? 每天下午 2 点到 2:55 期间的每 5 分钟触发
0 0/5 14,18 * * ? 每天下午 2 点到 2:55 期间和下午 6 点到 6:55 期间的每 5 分钟触发
0 0-5 14 * * ? 每天下午 2 点到 2:05 期间的每 1 分钟触发
0 10,44 14 ? 3 WED 每年三月的星期三的下午 2:10 和 2:44 触发
0 15 10 ? * MON-FRI 周一至周五的上午 10:15 触发
0 15 10 15 * ? 每月 15 日上午 10:15 触发
0 15 10 L * ? 每月最后一日的上午 10:15 触发
0 15 10 ? * 6L 每月的最后一个星期五上午 10:15 触发
0 15 10 ? * 6L 2002-2005 2002 年至 2005 年的每月的最后一个星期五上午 10:15 触发
0 15 10 ? * 6#3 每月的第三个星期五上午 10:15 触发