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

news2024/11/15 14:05:51

引言:

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 注解,以启用定时任务的自动配置功能。

再举一些例子如下:

@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 表达式,灵活地管理定时任务,并提高系统的稳定性和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/693289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Centos 从0到N

0x00 前言 最近一直在搞虚拟机,索性写一篇记录一下全过程,免得下次再去到处查资料 0x01 ssh 首先修改配置文件 vi /etc/ssh/sshd_config 开启端口以及listen 保存后重启服务 systemctl restart sshd 开机自启 chkconfig sshd on0x02 安装基础工具…

【Simulink】极值搜索控制 Extremum Seeking Control(无模型控制)

1.什么是极值搜索控制? 首先明确一下,对于yf(x),f(a)是函数f(x)的极大值或极小值,则a为函数f(x)的极值点,极大值点与极小值点统称为极值点。 极值搜索,顾名思义,就是找到极小值点或者极大值点…

【Java】什么是 Java 虚拟机 (JVM)

本文仅供学习参考! 相关教程(文章)地址: https://zhuanlan.zhihu.com/p/34426768 https://github.com/doocs/jvm Java 虚拟机 (JVM) 是 Java 编程语言的关键组件,为跨大多数主要硬件、操作系统和软件架构执行 Java 代码提供了一个独立于平台的…

在Windows上编译和调试CoreCLR

生成CoreCLR - Windows篇 本文的唯一目的就是让你运行Hello World 运行环境 Window 7 Visual studio 2015 确保C 工具已经被安装,默认是不安装的,所以要选择自定义模式,VS 2015 精简版不支持。 CMake 下载 CMake for windows,并把Cmak…

LeetCode刷题 | 518. 零钱兑换 II、377. 组合总和 Ⅳ、

518. 零钱兑换 II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 …

Python学习——集合

一、集合的定义 集合也是Python语言所提供的内置数据结构,集合与列表、字典一样都属于可变类型的序列,集合是没有value的字典,所以集合也是无序的。 二、集合的创建 方式一:使用大括号进行创建 #使用大括号创建结合 s{1,3,5,7,9}…

STM32H743 SOEM EtherCAT基于STM32H743芯片和SOEM的EtherCAT主站源码

一个基于STM32H743芯片和SOEM协议栈的EtherCAT主站源码。该源码提供了配套的CUBE工程,使用的是SOEM协议栈的1.3.1版本。此外,还可以使用NUCLEO-H743ZI开发板进行配套开发。该系统支持DC同步,并且可以与多种驱动器型号配合使用,包括…

VC++添加一般类

VC6新建一个单文档工程; 然后从菜单中选择 插入类;弹出下图对话框;选择类的类型为 Generic Class; 输入类名; 确定之后,会生成一个.h文件,一个.cpp文件;包含基本的构造和析构函数&…

Day07

目录 1、使用JsonIgnoreProperties 2、前端日期字符串转换LocalDateTime异常 1、使用JsonIgnoreProperties 在做项目时把前端的JSON对象转为dto对象时,出现了异常 Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse er…

go-cqhttp签名服务sign-server的本地搭建

新版go-cqhttp新增签名服务器签名服务器相关问题 Issue #2242 Mrs4s/go-cqhttp GitHubhttps://github.com/Mrs4s/go-cqhttp/issues/2242 其在win10系统下本地化搭建的方式为: 1.解压缩qq安装包提取lib里面的libfekit.so、libQSec.so文件并存放至一个文件夹&…

【Vue3】CustomImport 导入文件组件

1. 效果图 2. 组件完整代码 <template><div class"custom-import-warpper"><el-dialog v-model"dialogVisible" :title"dialogTitle" width"600px" :close-on-click-modal"false"><el-form label-wid…

SAP从入门到放弃系列之报废率-主数据维护-Scrap

文章目录 一、前言二、场景概述&#xff1a;三、报废的类型&#xff1a;3.1、装配报废3.2、组件报废3.3、工序报废-料废3.4、工序报废-工废 四、数据维护&#xff1a;4.1、装配报废&#xff08;Assembly scrap&#xff09;4.2、组件报废(Component scrap)4.3、工序报废-料废(Op…

windows环境使用cmake配置pcl

安装环境 cmake版本&#xff1a;cmake-3.26.3-windows-x86_64 pcl版本&#xff1a;PCL 1.13.1 vs版本&#xff1a;vs2022 配置流程 cmake编译准备&#xff1a;新建两个文件夹source和cmake_bin。source用于存放.cpp文件和CMakeLists.txt 文件&#xff1b;cmake_bin存放配置生…

【NLP】理解LSTM的内在逻辑

一、说明 在学习RNN的时候,多少有些东西可以作为实例进行原理性实践;而进入LSTM时代,短小的能说明原理的案例实验并不多,相反,对此的参考文献却海啸般地到来,让人来不及消化;本文是万篇论文之一,因其叙述的独特性,被我选入介绍给大家。 二、从循环神经网络说起 人类并…

LeetCode刷题 | 1049. 最后一块石头的重量 II、494. 目标和、474. 一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c; 且 x < y。那么粉碎的可能结…

死信是什么,如何运用RabbitMQ的死信机制?

系列文章目录 手把手教你&#xff0c;本地RabbitMQ服务搭建&#xff08;windows&#xff09; 消息队列选型——为什么选择RabbitMQ RabbitMQ 五种消息模型 RabbitMQ 能保证消息可靠性吗 推或拉&#xff1f; RabbitMQ 消费模式该如何选择 死信是什么&#xff0c;如何运用Rabbit…

使用影刀RPA合并excel数据

合并不同sheet&#xff1a; 先获取不同sheet中的表头&#xff0c;合并所有表头并去重存作列表&#xff0c;新建excel在第一行插入该表头数据,作合并数据存放使用循环方法&#xff0c;依次获取每个sheet的数据&#xff0c;用if判断表头是否在1的列表中&#xff0c;在的话则将整…

618技术揭秘:探究竞速榜页面核心前端技术 | 京东云技术团队

前言 H5页面作为移动端Web应用的重要形式之一&#xff0c;已经成为了现代Web开发的热门话题。在H5页面的开发过程中&#xff0c;前端技术的应用至关重要。本文将探究京东竞速榜H5页面的核心前端技术&#xff0c;包括动画、样式配置化、皮肤切换、海报技术、调试技巧等方面&…

easyX库图像处理相关函数

0.图像处理相关函数与类型概览 您好&#xff0c;这里是limou3434&#xff0c;本次我将给您带来的是easyX的图像处理相关接口。 如果您感兴趣也可以看看我的其他内容。 函数或数据类型描述IMAGE保存图像的对象。loadimage读取图片文件。putimage在当前绘图设备上绘制指定图像…

10--Gradle进阶 - Gradle任务的执行

10--Gradle进阶 - Gradle任务的执行 前言 在前面的篇章中&#xff0c;我们尝试执行了 gradle 的 task&#xff0c;但是不清楚有哪些语法&#xff0c;下面来介绍一下。 任务执行 任务执行语法&#xff1a;gradle [taskName...] [--option-name...]。 分类解释常见的任务&#xf…