SpringBoot2 | 第二十一篇:使用@Scheduled实现定时任务

下面使用 Spring@Scheduled 注解实现定时任务

[TOC]

环境/版本一览:

  • 开发工具:Intellij IDEA 2018.2.2
  • springboot: 2.0.6.RELEASE
  • jdk:1.8.0_171
  • maven:3.3.9

1、pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

2、component

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.fatal.component;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
* 定时任务组件
* @author: Fatal
* @date: 2018/10/27 0027 16:47
*/
@Slf4j
@Component
public class ScheduledTasks {

private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

@Scheduled(fixedRate = 5000)
// @Scheduled(cron = "0/5 * * * * *")
public void scheduled1() throws Exception {
log.info("scheduled1 现在时间:" + format.format(new Date()));
}

}

3、Application

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.fatal;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling // 开启定时任务
@SpringBootApplication
public class Chapter21Application {

public static void main(String[] args) {
SpringApplication.run(Chapter21Application.class, args);
}
}

4、显示

1540634463215

笔记

@Scheduled详解

在上面的入门例子中,使用了@Scheduled(fixedRate = 5000) 注解来定义每过5秒执行的任务,对于@Scheduled的使用可以总结如下几种方式:

  • @Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
  • @Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
  • @Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
  • @Scheduled(cron="*/5 * * * * *") :通过cron表达式定义规则

Cron 表达式

1. 介绍

cron 的表达式是字符串,实际上是由 七个子表达式 构成,描述个别细节的时间表。这些子表达式是分开的空白,代表:

序号 名字 描述(每一个表达式都有一套可以指定有效值)
1 Seconds 可以用数字 0-59 表示
2 Minutes 可以用数字 0-59 表示
3 Hours 可以用数字 0 - 23
4 Day-of-Month 可以用数字 1-31 中的任一一个值,但要注意一些特别的月份
5 Month 可以用 0-11 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
6 Day-of-Week 可以用数字 1 - 7 表示(1 = 星期日)或用字符口串 “SUN, MON, TUE, WED, THU, FRI and SAT” 表示
7 Year (可选字段) 可以用数字 1977-2099 表示

例 :”0 0 12 ? * WED” 在每星期三下午12:00 执行

析:个别子表达式可以包含 范围,例如,在前面的例子里(“WED”)可以替换成 “MON-FRI”, “MON, WED, FRI”甚至“MON-WED,SAT”.

2. 特殊字符

字符 描述
* 代表整个时间段.
/ 表示为“每”。如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次,“3”表示从第3分钟开始执行
? 表示每月的某一天,或每周的某一天
L 用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几。如“6L”放在Day-of-Week上,表示“每月的最后一个星期五”(6:每月的周五;L:在这里代表最后一周)
W 表示为最近工作日,如“15W”放在每月(day-of-month)字段上表示为“到本月15日最近的工作日”
# 是用来指定“的”每月第n个工作日,例 在每周(day-of-week)这个字段中内容为”6#3” or “FRI#3” 则表示“每月第三个星期五”
, 逗号 分隔表达式中的数值
- 横杆 用在两个数值中间表示 范围

3. 格式

名字 允许的值 允许的值
0-59 , - * /
0-59 , - * /
小时 0-23 , - * ? / L W C
1-31 , - * /
1-12 or JAN-DEC , - * ? / L C #
1-7 or SUN-SAT , - * /
年 (可选字段) empty,1970-2099 , - * /

4. 示例

  • 每隔5秒执行一次:/5 * ?

  • 每隔1分钟执行一次:0 /1 ?

  • 每天23点执行一次:0 0 23 ?
  • 每天凌晨1点执行一次:0 0 1 ?
  • 每月1号凌晨1点执行一次:0 0 1 1 * ?
  • 每月最后一天23点执行一次:0 0 23 L * ?
  • 每周星期天凌晨1点实行一次:0 0 1 ? * L
  • 在26分、29分、33分执行一次:0 26,29,33 * ?
  • 每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 ?

参考资料

Spring Boot中使用@Scheduled创建定时任务

总结

SpringBoot 中使用 Spring 注解 @Scheduled 注解实现定时任务很简单,只需两步:

  • 在配置类上加 @EnableScheduling(开启定时任务功能)
  • 在定时方法上加 @Scheduled

SpringBoot的知识已经有前辈在我们之前探索了。比较喜欢的博主有:唐亚峰 | Battcn方志朋的专栏程序猿DD纯洁的微笑。对这门技术感兴趣的可以去他们的博客逛逛。谢谢他们的分享~~

以上文章是我用来学习的Demo,都是基于 SpringBoot2.x 版本。

源码地址: https://github.com/ynfatal/springboot2-learning/tree/master/chapter21

学习 翟永超 前辈的经验