Spring定时任务注解@Scheduled详解

 更新时间:2023年09月25日 10:21:56   作者:至学者  
这篇文章主要介绍了Spring定时任务注解@Scheduled详解,@Scheduled注解是包org.springframework.scheduling.annotation中的一个注解,主要是用来开启定时任务,本文提供了部分实现代码与思路,需要的朋友可以参考下

一 概述

@Scheduled注解是包org.springframework.scheduling.annotation中的一个注解,主要是用来开启定时任务。

二 @Scheduled注解的源码

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
    String CRON_DISABLED = "-";
    String cron() default "";
    String zone() default "";
    long fixedDelay() default -1L;
    String fixedDelayString() default "";
    long fixedRate() default -1L;
    String fixedRateString() default "";
    long initialDelay() default -1L;
    String initialDelayString() default "";
}

根据注解源码可知,该注解是方法声明式注解和注解类型声明式注解。

三 @Scheduled注解中的主要参数

fixedDelay

@Scheduled(fixedDelay = 5000)
//将一个方法以上一个调用任务的完成之间为基准,在上一个任务完成之后,5s后再执行该方法。
public void doSomething() { 
// something that should execute periodically
}

fixedRate

@Scheduled(fixedRate = 5000)
//将一个方法以固定速率5s调用一次执行,这个周期是一个任务开始时间为基准,从上一个任务开始执行后5秒后再调用一次。
public void doSomething() { 
// something that should execute periodically
}

上述两个重要的参数只是提了简单的定时调用规则,当需要更为复杂的调用时我们可以通过参数cron进行设置。

四 复杂调度之参数cron

我们可以通过参数corn来编写表达式,然后通过表达式来配置任务的执行时间。其中每个corn表达式中至少会存在6个用空格分隔的时间元素,它们顺序依次为:

  • 秒(0~59)
  • 分钟(0~59)
  • 小时(0~23)
  • 天(0~31)
  • 月(0~11)
  • 星期(1~7或者SUN-SAT[SUN,MON,TUE,WED,THU,FRI,SAT])
  • 年份(1970~2099)

Seconds Minutes Hours DayofMonth Month DayofWeek

Cron格式中每个时间元素的说明

时间元素可出现的字符有效数值范围
Seconds,- * /0~59
Minutes,- * /0~59
Hours,- * /0~23
DayofMonth,- * / ? L W0~31
Month,- * /1~12
DayofWeek,- * / ? L #1~7或者SUN~SAT

Cron格式中特殊字符说明

字符作用举例
列出枚举值在Minutes域中使用6,8,则表示6分钟和8分钟各触发一次
-表示触发的范围值在Minutes域中使用6-8,则表示从6分钟到8分钟之间每分钟触发一次
*匹配任意值在Minutes域中使用*,则表示每分钟都会触发一次
/起始时间开始触发,每隔固定时间触发一次在Minutes域中使用6/8,表示5分钟触发一次,每10分钟再触发一次
在DayofMonth和DayofWeek中,用于匹配任意值在DayofMonth域使用?,表示每天都触发一次
#在DayofMonth中,确定第几个星期几7#3表示第三个星期六
L表示最后在DayofWeek中使用6L,表示在最后一个星期五触发
W表示有效工作日(周一到周五)在DayofMonth使用5W,如果5日是星期六,则将最近的工作日4日触发一次

注意:LW是可以连用,表示在某个月最后一个工作日,#是用来确定每个月第几个星期几的,只能出现在DayofMonth域中。

常用的Cron表达式

每隔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 * * ?"
每天上午10点,下午2点,4点:"0 0 10,14,16 * * ?"
朝九晚五工作时间内每半小时:"0 0/30 9-17 * * ?"
表示每个星期三中午12点:"0 0 12 ? * WED" 
每天中午12点触发:"0 0 12 * * ?"
每天上午10:15触发:"0 15 10 ? * *"
每天上午10:15触发:"0 15 10 * * ?"
每天上午10:15触发:"0 15 10 * * ? *"
2005年的每天上午10:15触发: "0 15 10 * * ? 2005"
在每天下午2点到下午2:59期间的每1分钟触发: "0 * 14 * * ?"
在每天下午2点到下午2:55期间的每5分钟触发: "0 0/5 14 * * ?"
在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发: "0 0/5 14,18 * * ?"
在每天下午2点到下午2:05期间的每1分钟触发: "0 0-5 14 * * ?" 
每年三月的星期三的下午2:10和2:44触发: "0 10,44 14 ? 3 WED" 
周一至周五的上午10:15触发: "0 15 10 ? * MON-FRI"
每月15日上午10:15触发: "0 15 10 15 * ?" 
每月最后一日的上午10:15触发: "0 15 10 L * ?"
每月的最后一个星期五上午10:15触发: "0 15 10 ? * 6L"
2002年至2005年的每月的最后一个星期五上午10:15触发: "0 15 10 ? * 6L 2002-2005"

到此这篇关于Spring定时任务注解@Scheduled详解的文章就介绍到这了,更多相关Spring的@Scheduled内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java使用泛型Class实现消除模板代码

    Java使用泛型Class实现消除模板代码

    Class作为实现反射功能的类,在开发中经常会用到,然而,当Class遇上泛型后,事情就变得不是那么简单了,所以本文就来讲讲Java如何使用泛型Class实现消除模板代码,需要的可以参考一下
    2023-06-06
  • 在Spring中如何使用动态代理?

    在Spring中如何使用动态代理?

    上篇文章记录自定义切面,下边记录使用注解来编写自定义切面,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 解决Maven项目中 Invalid bound statement 无效的绑定问题

    解决Maven项目中 Invalid bound statement 无效的绑定问题

    这篇文章主要介绍了解决Maven项目中 Invalid bound statement 无效的绑定问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 详解Spring集成Redis的两种方式

    详解Spring集成Redis的两种方式

    在工作中,我们用到分布式缓存的时候,第一选择就是Redis,今天介绍一下SpringBoot如何集成Redis的,具有一定的参考价值,感兴趣的可以了解一下
    2021-09-09
  • 深入浅析springsecurity入门登录授权

    深入浅析springsecurity入门登录授权

    SpringSecurity为我们提供了基于注解的权限控制方案,这也是我们项目中主要采用的方式,我们可以使用注解去指定访问对应的资源所需的权限,这篇文章主要介绍了springsecurity入门登录授权,需要的朋友可以参考下
    2024-05-05
  • SpringBoot基于AOP的本地/远程调用动态路由实践指南

    SpringBoot基于AOP的本地/远程调用动态路由实践指南

    这篇文章主要为大家详细介绍了SpringBoot基于AOP的本地/远程调用动态路由实践指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-07-07
  • jar包运行一段时间后莫名其妙挂掉线上问题及处理方案

    jar包运行一段时间后莫名其妙挂掉线上问题及处理方案

    这篇文章主要介绍了jar包运行一段时间后莫名其妙挂掉线上问题及处理方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • SpringBoot整合FastJson过程解析

    SpringBoot整合FastJson过程解析

    这篇文章主要介绍了SpringBoot整合FastJson过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • Java运算符易混点之&&、||、&、|与 到底差在哪详解

    Java运算符易混点之&&、||、&、|与 到底差在哪详解

    这篇文章主要介绍了Java运算符易混点之&&、||、&、|与 到底差在哪的相关资料,强调在条件判断和位运算场景下的正确使用法,并提供示例代码帮助理解大家理解,需要的朋友可以参考下
    2026-06-06
  • java LinkedList的实例详解

    java LinkedList的实例详解

    这篇文章主要介绍了java LinkedList的实例详解的相关资料,通过本文希望大家能彻底了解掌握这部分内容,需要的朋友可以参考下
    2017-09-09

最新评论