Spring 定时任务@Scheduled 注解中的 Cron 表达式

这篇具有很好参考价值的文章主要介绍了Spring 定时任务@Scheduled 注解中的 Cron 表达式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言:

Spring 框架提供了强大的定时任务功能,通过 @Scheduled 注解可以方便地定义和管理定时任务。其中,Cron 表达式作为定时任务触发的时间表达式,扮演着重要的角色。本篇博客将详细介绍和讲解 Cron 表达式的语法和常见用法,帮助各位更好地理解和使用 Spring 的定时任务功能。

1、什么是 Cron 表达式?

Cron 表达式是一种用于描述定时任务触发时间的字符串表达式。它由多个时间字段组成,每个字段代表定时任务在特定时间单位上的触发条件。通过设置不同的时间字段值,我们可以灵活地定制定时任务的触发时间。

2、Cron 表达式语法详解

Cron 表达式是一种用于描述定时任务触发时间的字符串表达式。它由多个时间字段组成,每个字段代表定时任务在特定时间单位上的触发条件。Cron 表达式的语法相对复杂,但是一旦掌握,就可以灵活地定义各种定时任务的触发时间。

Cron 表达式的语法格式如下:

秒   分   时   日   月   星期   年份

其中,每个时间字段都有对应的取值范围和特殊符号。下面是每个时间字段的详细说明:

1、秒(Seconds):取值范围为 0~59。例如,`0/5` 表示每隔 5 秒触发一次,`*` 表示每秒都触发。

2、分钟(Minutes):取值范围为 0~59。例如,`0/5` 表示每隔 5 分钟触发一次,`*` 表示每分钟都触发。

3、小时(Hours):取值范围为 0~23。例如,`0/2` 表示每隔 2 小时触发一次,`*` 表示每小时都触发。

4、日期(Day of Month):取值范围为 1~31。例如,`1,15` 表示每月的 1 日和 15 日触发,`*` 表示每天都触发。

5、月份(Month):取值范围为 1~12,也可以使用英文缩写 JAN、FEB、MAR 等。例如,`1,6` 表示一月和六月触发,`*` 表示每个月都触发。

6、 星期(Day of Week):取值范围为 1~7,1 表示星期日,2 表示星期一,以此类推,也可以使用英文缩写 SUN、MON、TUE 等。例如,`2-6` 表示星期一到星期五触发,`*` 表示每个星期都触发。

7、年份(Year):可选字段,表示触发条件的年份。例如,`2023` 表示在 2023 年触发,`*` 表示每年都触发。

除了取值范围,Cron 表达式还支持一些特殊符号,用于指定特定的触发条件,例如:

- 星号(*):代表所有可能的取值,表示不限制该时间字段的取值范围。
- 问号(?):仅在日期和星期字段中使用,表示不指定具体的取值,可以任意匹配。
- 斜线(/):表示间隔触发,例如在分钟字段中,"*/5" 表示每隔 5 分钟触发一次。
- 逗号(,):用于指定多个取值,例如在小时字段中,"1,3,5" 表示在第 1、3、5 小时触发。
- 减号(-):用于指定一个范围,例如在月份字段中,"3-6" 表示三月到六月触发。

3、在 @Scheduled 注解中使用 Cron 表达式

通过灵活组合和设置时间字段的取值和特殊符号,我们可以编写出各种复杂的定时任务触发条件,满足不同业务场景的需求。

在 Spring 框架中,可以使用 @Scheduled 注解配合 Cron 表达式来定义定时任务。例如:

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class MyScheduledTask {

    @Scheduled(cron = "0 0 8 * * ?") // 每天早上 8 点触发任务
    public void myTask() {
        // 定时任务执行的逻辑代码
        System.out.println("定时任务执行中...");
    }
}

上述示例中,我们定义了一个名为 MyScheduledTask 的类,并使用 @Scheduled 注解标记了一个方法 myTask()。通过设置 cron 属性为 "0 0 8 * * ?",表示每天早上 8 点触发定时任务。

 注意事项:@Scheduled 注解需要结合 Spring 框架的定时任务功能一起使用,确保 Spring 容器正确扫描和管理定时任务。

举例:在 Spring Boot 应用中,在启动类上添加 @EnableScheduling 注解,以启用定时任务的自动配置功能。

Spring 定时任务@Scheduled 注解中的 Cron 表达式

再举一些例子如下:

@Scheduled(cron = "0 */1 * * * ?")
public void myTask() {
    System.out.println("每隔一分钟执行一次定时任务");
}
@Scheduled(cron = "0 0 10,15,20 * * ?")
public void myTask() {
    System.out.println("每天的 10 点、15 点、20 点触发定时任务");
}
@Scheduled(cron = "0 0 12 ? * SUN")
public void myTask() {
    System.out.println("每周日的中午 12 点触发定时任务");
}
@Scheduled(cron = "0 0 0 L * ?")
public void myTask() {
    System.out.println("每个月的最后一天触发定时任务");
}
@Scheduled(cron = "0 0/5 9-17 * * MON-FRI")
public void myTask() {
    System.out.println("工作日的早上 9 点到下午 5 点,每隔 5 分钟触发定时任务");
}

4、Cron 表达式常见问题和注意事项

  1. Cron 表达式的顺序:Cron 表达式中各个时间字段的顺序是固定的,且不能改变。按照秒、分钟、小时、日期、月份、星期、年份的顺序进行设置。

  2. 字段取值范围:要确保设置的字段取值范围是正确的,否则可能导致定时任务无法触发。例如,日期字段的取值范围为 1~31,如果设置了一个超出范围的值,定时任务将不会触发。

  3. 特殊字符的使用:Cron 表达式中有一些特殊字符需要正确使用。例如,使用星号(*)表示所有可能的取值,使用问号(?)表示不指定具体的取值,使用斜线(/)表示间隔触发等。要确保特殊字符的使用符合预期。

  4. 注意空格:Cron 表达式中各个时间字段之间需要使用空格进行分隔。如果没有正确使用空格,Cron 表达式可能无法解析,导致定时任务无法触发。

  5. 逻辑关系:Cron 表达式中各个时间字段之间的逻辑关系要清楚。例如,如果同时设置了日期和星期字段,它们之间是逻辑与的关系,表示两者都满足时触发定时任务。

  6. 定时任务执行时间:要注意定时任务的执行时间和系统时区之间的关系。Cron 表达式中定义的时间是相对于系统时区的时间。如果系统时区发生变化,定时任务的执行时间也会相应发生变化。

  7. 定时任务重叠:在使用 Cron 表达式定义定时任务时,要注意避免定时任务之间的重叠。如果设置了多个定时任务,确保它们的触发时间不会有重叠,以免导致任务重复执行或任务堆积。

  8. 定时任务的错误处理:在定时任务的执行过程中,可能会出现异常或错误情况。要确保在定时任务中进行适当的错误处理,例如记录日志、发送通知或采取其他措施来处理异常情况。

  9. 定时任务的性能考虑:当定义大量的定时任务时,要考虑定时任务的性能影响。过多的定时任务可能会占用系统资源或导致系统负载过高。因此,要合理设计和管理定时任务,确保系统的性能和稳定性。

5、总结和扩展阅读

Cron 表达式是一种用于定义定时任务触发时间的字符串表示形式。它由七个字段组成,分别表示秒、分钟、小时、日期、月份、星期和年份。通过设置这些字段的取值,可以灵活地定义定时任务的触发时间。

在使用 Cron 表达式时,需要注意字段的顺序、取值范围、特殊字符的使用以及逻辑关系等。合理设置表达式可以确保定时任务按预期运行。同时,还要注意定时任务执行时间与系统时区之间的关系,以及错误处理、性能考虑等方面的问题。

扩展阅读:

如果你对 Cron 表达式感兴趣,可以进一步深入学习相关的知识和技巧。以下是一些扩展阅读的建议:

  1. Cron 表达式语法详解:深入了解 Cron 表达式的语法规则和各个字段的含义,掌握更多高级用法和技巧。

  2. Quartz 调度器:Quartz 是一个功能强大的 Java 调度器框架,支持使用 Cron 表达式定义和管理定时任务。学习使用 Quartz 可以更好地理解和应用 Cron 表达式。

  3. Spring 中的定时任务:了解 Spring 框架中的定时任务功能,包括使用 @Scheduled 注解和配置文件来定义和管理定时任务。

  4. 分布式定时任务:如果需要在分布式环境中管理定时任务,可以了解一些分布式调度框架,如分布式任务调度系统(如 Elastic Job、XXL-Job 等),掌握分布式定时任务的实现原理和使用方法。

  5. 定时任务最佳实践:了解定时任务的最佳实践,包括避免任务重叠、优化性能、合理设置任务调度策略等方面的建议。

通过深入学习和实践,你可以更好地理解和应用 Cron 表达式,灵活地管理定时任务,并提高系统的稳定性和性能。文章来源地址https://www.toymoban.com/news/detail-503603.html

到了这里,关于Spring 定时任务@Scheduled 注解中的 Cron 表达式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot自定义cron表达式注册定时任务

    1、使用Spring自带的TaskScheduler注册任务 2、注册后返回:ScheduledFuture,用于取消定时任务 3、注册任务后不会马上取消任务,所以将任务缓存。在需要取消任务的时候调用取消接口取消 4、cron表达式可以由前端或者后端生成。实现中会校验cron表达式 1、配置任务调度器 作用:设

    2023年04月21日
    浏览(38)
  • Cron表达式简单介绍 + Springboot定时任务的应用

    前言 表达式是一个字符串,主要分成6或7个域,但至少需要6个域组成,且每个域之间以空格符隔开。 以7个域组成的,从右往左是【年 星期 月份 日期 小时 分钟 秒钟】 秒 分 时 日 月 星期 年 以6个域组成的,从右往左是【星期 月份 日期 小时 分钟 秒钟】 秒 分 时 日 月 星

    2023年04月20日
    浏览(37)
  • SpringBoot 定时任务 @Scheduled 集群环境优化 (使用分布式锁, 注解形式)

    SpringBoot提供了 Schedule模块完美支持定时任务的执行 在实际开发中由于项目部署在分布式或集群服务器上 会导致定时任务多次触发 因此,使用redis分布锁机制可以有效避免多次执行定时任务   核心方法是org.springframework.data.redis.core包下的  setIfAbsent() 方法 返回值为布尔类型

    2024年02月15日
    浏览(36)
  • 开源:Taurus.DTS 微服务分布式任务框架,支持即时任务、延时任务、Cron表达式定时任务和广播任务

    在发布完:开源:Taurus.DTC 微服务分布式事务框架,支持 .Net 和 .Net Core 双系列版本,之后想想,好像除了事务外,感觉里面多了一个任务发布订阅的基础功能。 本想既然都有了基础发布订阅功能了,那要不要顺带加上延时发布功能呢?加上了会不会让事务组件不纯了? 经过

    2024年01月21日
    浏览(43)
  • 开源:Taurus.DTS 微服务分布式任务框架,支持即时任务、延时任务、Cron表达式定时任务和广播任务。

    在发布完:开源:Taurus.DTC 微服务分布式事务框架,支持 .Net 和 .Net Core 双系列版本,之后想想,好像除了事务外,感觉里面多了一个任务发布订阅的基础功能。 本想既然都有了基础发布订阅功能了,那要不要顺带加上延时发布功能呢?加上了会不会让事务组件不纯了? 经过

    2024年01月18日
    浏览(50)
  • Cron在前端的使用,vue与element ui的vue-cron插件的使用及将定时任务cron表达式解析成中文

    执行下面npm命令: npm install vue-cron --save 在想使用cron的vue页面引入以下: import VueCron from ‘vue-cron’ import Vue from ‘vue’ Vue.use(VueCron) 运行 在vue页面“style scoped”中通过控制样式去掉秒年 #changeContab /deep/ #tab-0 { display: none; } #changeContab /deep/ #tab-5 { display: none; } 简易的工具类 可根

    2024年02月11日
    浏览(54)
  • SpringBoot中的定时任务@Scheduled的使用

    在spring boot的项目中需要使用到定时任务的时候,可以使用@Scheduled注解,这只是在一个JVM进程中很适用,如果涉及到服务器是集群的情况下,建议使用任务调度平台。这样任务调度平台会在多台服务器中选择一台进行定时任务的执行。该注解位于 spring-context.jar 包中 属性 说明

    2024年02月09日
    浏览(40)
  • SpringBoot @Scheduled注解(cron、fixedRate、fixedDelay、initialDelay)各个参数区别

    fixedDelay控制方法执行的间隔时间(毫秒),是以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,并间隔给定的时间后,执行下一次。上个过程结束后,等待300ms,执行下个过程 fixedRate是按照一定的速率执行,是从上一次方法执行开始的时间算

    2024年02月09日
    浏览(28)
  • Spring@Scheduled定时任务接入XXL-JOB的一种方案(基于SC Gateway)

    目前在职的公司,维护着Spring Cloud分布式微服务项目有25+个。其中有10个左右微服务都写有定时任务逻辑,采用Spring @Scheduled这种方式。 Spring @Scheduled定时任务的缺点: 不支持集群:为避免重复执行,需引入分布式锁 死板不灵活:不支持手动执行,单次执行,补偿执行,修改

    2024年02月11日
    浏览(47)
  • 定时任务特辑 | Quartz、xxl-job、elastic-job、Cron四个定时任务框架对比,和Spring Boot集成实战

    专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏: Python 专栏: Redis 专栏: TensorFlow 专栏: Logback 专栏: 量子计算: 量子计算 | 解密著名量子算法Shor算法和Grover算法 AI机器学习实战: AI机器学习实战 | 使用 Python 和 scikit-learn 库进行情感分析 AI机器学习 | 基于lib

    2024年02月05日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包