@Scheduled 注解基本介绍
@Scheduled 比较官方一点的介绍 : 是 Spring 框架中用于定时调度任务的注解。它允许您将一个方法标记为一个定时任务,然后可以配置任务的执行时间间隔或 cron 表达式。这个注解通常与 Spring Boot 一起使用,以创建定时任务。
其实很简单,就是说,被@Scheduled标注的方法,会定时的执行。刚开始接触时,会有点理解不了这个定时执行,因为程序中的方法一般都是被调用之后才会执行。而这个定时执行是什么意思呢?没错,就是你想的这个意思:在spring项目中,主程序执行,项目启动之后,被@Scheduled标注的方法,就会定时的执行(每隔这么久时间就执行一次这个方法),不需要调用。
一般会应用在,比如: 定时执行任务、定时数据同步、缓存刷新、定时提醒和通知、定时报警和日志记录、定时任务调度管理 等场景
@Scheduled 注解基本使用
对这个注解有了大致的了解之后,我们来讲一下怎么使用
因为是Spring框架中的注解,所以当然是要引入Spring Boot Starter 或其他 Spring 的相关依赖啦
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
为了使@Scheduled生效,我们需要在 Spring Boot 应用中启用定时任务调度,很简单,在主应用类上添加
@EnableScheduling
注解就OK了
@SpringBootApplication
@EnableScheduling // 启用定时任务
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}
然后来看一下@Scheduled 在程序中在哪里定义、怎么去配置定时执行的时间
@Scheduled
注解通常用于Spring管理的Bean的方法
@Component // 声明这个类为一个Spring管理的Bean
public class MyScheduledBean {
@Scheduled(fixedRate = 5000) // 每隔5秒执行一次
public void myScheduledMethod() {
// 这里放置需要定时执行的逻辑
System.out.println("Scheduled method executed!");
}
}
@Scheduled
有四种属性,可供使用者对方法执行的时间进行配置
- fixedRate:它指定了任务按照固定的速率执行,以毫秒为单位。例如,
fixedRate = 5000
表示每隔5秒执行一次,无论任务执行时间长短。 - fixedDelay:这个属性指定了任务在上一次任务完成后,等待指定的时间再执行下一次任务,以毫秒为单位。
- initialDelay:这个属性用于配置在应用启动后,首次执行任务之前等待的时间,以毫秒为单位。它可以用于延迟任务的启动,以防止在应用启动时立即执行任务。
- cron:使用
cron
表达式配置任务的执行时间,这是一种非常灵活的方式。cron
表达式允许你定义任务的执行时间规则,包括秒、分、时、日期等。例如,@Scheduled(cron = "0 0 2 * * ?")
表示每天凌晨2点执行。
其中,前三个属性就跟上面的例子一样使用就好了,这里详细说一下cron表达式的使用
CRON表达式
cron
属性用于在Spring中非常灵活地配置任务的执行时间,基于CRON表达式的时间规则。CRON表达式由多个字段组成,每个字段表示不同的时间单位和条件。以下是一个基本的CRON表达式结构:
second minute hour day-of-month month day-of-week
每个字段可以包含一个数字、多个数字或特殊字符,例如星号(*)、问号(?)、斜杠(/)等。下面是一些常用的CRON表达式示例:
-
每天的午夜12点执行(0秒、0分、0时):
@Scheduled(cron = "0 0 0 * * ?")
-
每周日的中午12点执行:
@Scheduled(cron = "0 0 12 ? * SUN")
-
每小时的15分执行:
@Scheduled(cron = "0 15 * * * ?")
-
每隔5秒执行一次:
@Scheduled(cron = "0/5 * * * * ?")
CRON表达式字段的含义如下:
second
:秒(0-59)minute
:分(0-59)hour
:时(0-23)day-of-month
:每月的某一天(1-31)month
:月份(1-12或JAN-DEC)day-of-week
:每周的某一天(0-7或SUN-SAT,0和7都代表星期日)
有一些特殊字符也可以在CRON表达式中使用:
*
:代表匹配任何值。例如,*
在分钟字段中表示”每“分钟。?
:用于不指定特定的值,通常用于day-of-month
和day-of-week
字段中的一个。/
:用于指定间隔值。例如,*/5
在分钟字段中表示每5分钟执行一次。-
:用于指定范围。例如,1-5
在day-of-week
字段中表示星期一到星期五。,
:用于列出多个值。例如,MON, WED, FRI
在day-of-week
字段中表示星期一、星期三和星期五。L
:用于表示“最后”的意思。通常用于day-of-month
和day-of-week
字段。例如:0 0 1 * * L
:每月的最后一天执行一次。
W
:用于工作日(平日)的最接近的工作日。例如:0 0 15 ? * WED
:每月的第三个工作日执行一次。
#
:用于表示day-of-week
字段中的第几个工作日。例如:0 0 ? * 1#2
:每月的第二个星期一执行一次。
注意事项
还有一点需要注意的是@Scheduled 方法是单线程
,在主线程上执行的。所以会阻塞主线程。不同的@Scheduled方法之间也是相互制约的。
所以,需要使用@Async注解,开启方法的异步调用,这样@Scheduled定时任务就会在后台执行,不会阻塞主线程和其他请求的处理。