一. @Scheduled注解
@Scheduled 是 Spring 框架提供的一个注解,用于定义定时任务。通过使用 @Scheduled 注解,你可以轻松地创建定时执行的方法,并指定执行的时间表达式。
定时任务是指在预定的时间间隔或指定的时间点执行某个任务或方法。它在很多场景下非常有用,比如定时数据备份、定时发送邮件、定时生成报表等。
@Scheduled 注解可以应用在方法上,标志着该方法是一个定时任务。你可以使用不同的时间表达式来定义任务的执行时间。常见的时间表达式包括:
- 固定时间间隔执行:使用 fixedRate 属性,表示任务开始执行后固定的时间间隔执行一次。
- 固定延迟执行:使用 fixedDelay 属性,表示任务执行完成后延迟指定的时间间隔后再次执行。
- Cron 表达式执行:使用 cron 属性,使用 Cron 表达式来定义任务的执行时间,可以实现更灵活的定时任务配置。
其中最常用的就是根据Cron表达式来定时执行,下面介绍下Cron表达式。
二. Cron 表达式
Cron 表达式是一种用于指定定时任务执行时间的表达式,它在很多定时任务框架中都得到广泛应用,包括在 Java 的 Spring 框架中。Cron 表达式由6个或7个由空格分隔的时间元素组成,分别表示秒、分钟、小时、日期、月份、星期,以及可选的年份。每个时间元素可以是一个具体的值,一个逗号分隔的值列表,一个范围,或者一个通配符。
典型的 Cron 表达式的结构,上下对应:
秒 | 分 | 时 | 日 | 月 | 周 | 年 |
---|---|---|---|---|---|---|
* | * | * | * | * | * | * |
其中各个时间元素的含义以及其取值范围如下:
- 秒:(0-59)
- 分钟:(0-59)
- 小时:(0-23)
- 日期:(1-31)但要注意一些特别的月份
- 月份:(1-12 或 JAN-DEC)
- 星期:(0-7 或 SUN-SAT,其中 0 和 7 都表示星期日)
- 年份:(可选,留空表示任意年份)
这里我们直接留空年份,举几个简单的例子:
0 0 * * * * :每到整点执行一次
*/2 * * * * * :从0秒开始,每2秒执行一次
0 0 2 * * *:每天凌晨2点执行一次
可以将这几个表达式放进Cron在线表达式生成器执行一下查看最近5次的执行时间验证正确性。
三. 如何使用?
现在我们准备实现一个每2秒执行一次的定时任务。
- 在service的实现类我们写死一个方法,就查询id为2的user对象,并在方法名上加上@Scheduled(cron = “*/2 * * * * ?”)注解,代码如下:
@Scheduled(cron = "*/2 * * * * ?")
public User queryOne() {
return userMapper.selectById(2);
}
- 在启动类上加上@EnableScheduling注解
@SpringBootApplication
@MapperScan("org.example.mapper")
@EnableScheduling
public class MPApplication {
public static void main(String[] args) {
SpringApplication.run(MPApplication.class,args);
}
}
启动项目,运行结果如下: