@Scheduled 注解的基本介绍、使用

@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 有四种属性,可供使用者对方法执行的时间进行配置

  1. fixedRate:它指定了任务按照固定的速率执行,以毫秒为单位。例如,fixedRate = 5000 表示每隔5秒执行一次,无论任务执行时间长短
  2. fixedDelay:这个属性指定了任务在上一次任务完成后,等待指定的时间再执行下一次任务,以毫秒为单位。
  3. initialDelay:这个属性用于配置在应用启动后,首次执行任务之前等待的时间,以毫秒为单位。它可以用于延迟任务的启动,以防止在应用启动时立即执行任务。
  4. 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表达式示例:

  1. 每天的午夜12点执行(0秒、0分、0时):

    @Scheduled(cron = "0 0 0 * * ?")
    
  2. 每周日的中午12点执行

    @Scheduled(cron = "0 0 12 ? * SUN")
    
  3. 每小时的15分执行

    @Scheduled(cron = "0 15 * * * ?")
    
  4. 每隔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-monthday-of-week 字段中的一个。
  • /:用于指定间隔值。例如,*/5 在分钟字段中表示每5分钟执行一次。
  • -:用于指定范围。例如,1-5day-of-week 字段中表示星期一到星期五。
  • ,:用于列出多个值。例如,MON, WED, FRIday-of-week 字段中表示星期一、星期三和星期五。
  • L:用于表示“最后”的意思。通常用于 day-of-monthday-of-week 字段。例如:
    • 0 0 1 * * L:每月的最后一天执行一次。
  • W:用于工作日(平日)的最接近的工作日。例如:
    • 0 0 15 ? * WED:每月的第三个工作日执行一次。
  • #:用于表示 day-of-week 字段中的第几个工作日。例如:
    • 0 0 ? * 1#2:每月的第二个星期一执行一次。

注意事项

还有一点需要注意的是@Scheduled 方法是单线程,在主线程上执行的。所以会阻塞主线程。不同的@Scheduled方法之间也是相互制约的。

所以,需要使用@Async注解,开启方法的异步调用,这样@Scheduled定时任务就会在后台执行,不会阻塞主线程和其他请求的处理。
在这里插入图片描述

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值