SpringBoot @Scheduled Cron表达式使用方式

2025-03-24 14:50

本文主要是介绍SpringBoot @Scheduled Cron表达式使用方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《SpringBoot@ScheduledCron表达式使用方式》:本文主要介绍SpringBoot@ScheduledCron表达式使用方式,具有很好的参考价值,希望对大家有所帮助,如有...

Cron 表达式详解

Cron 表达式是用于定义定时任务执行时间的字符串,广泛应用于 Spring 的 @Scheduled、Quartz 等定时任务框架。

其核心是通过 ‌时间字段‌ 和 ‌通配符‌ 组合实现复杂的调度规则。

1. 表达式格式‌

Cron 表达式由 ‌6或7个字段‌ 组成,分别表示不同时间单位(Spring 中通常用 ‌6位‌ 格式)。

格式如下:

字段允许值特殊字符说明
秒(Seconds)0-59, - * /可精确到秒级调度
分(Minutes)0-59, - * /
小时(Hours)0-23, - * /
日(Day)1-31, - * / ? L W月份中的某一天
月(Month)1-12 或 JAN-DEC, - * /
周(Week)0-7 或 SUN-SAT (0=周日), - * / ? L #周几(1=MON, 7=SUN)
年(Year)1970-2099 (可选), - * /‌Spring 中通常省略

2. 特殊字符解析

符号作用示例
*匹配任意值0 * * * * ? 每分钟的0秒执行
?仅在 ‌日‌ 或 ‌周&zwnjjs; 字段使用,表示“无意义”0 0 0 * * ? 每天0点执行
-范围区间0 0 10-12 * * ? 10-12点每小时执行
,多个值0 0 2,14 * * ? 每天2点和14点执行
/步长(间隔时间)0 0/5 * * * ? 每隔5分钟执行
L最后一天(仅 ‌日‌ 或 ‌周‌ 字段)0 0 L * * ? 每月最后一天0点执行
W最近工作日(仅 ‌日‌ 字段)0 0 0 15W * ? 每月15日最近的工作日执行
#指定月份的周几(仅 ‌周‌ 字段)0 0 0 ? * 6#3 每月第3个周五执行

3. 常用示例

表达式说明
0 0 12 * * ?每天中午12点执行
0 0/5 14 * * ?每天下午2点开始,每隔5分钟执行一次
0 15 10 ? * MON-FRI每周一至周五上午10:15执行
0 0 0 1 1 ? 20242024年1月1日0点执行(需7位表达式)
0 0 8-18/2 ? * MON每周一上午8点到下午6点,每隔2小时执行一次
0 0 0 L * ?每月最后一天的0点执行
0 0 0 15W * ?每月15日最近的工作日执行
0 0 0 ? * 6#3每月第3个周五0点执行

‌4. 重点规则

‌1. 日与周的互斥性‌

  • 若同时指定 ‌日‌ 和 ‌周‌,需用 ? 忽略其中一个字段。
  • ✅ 正确:0 0 0 ? * MON(每周一执行,忽略日)
  • ❌ 错误:0 0 0 * * MON(日和周同时生效,可能冲突)

2‌. 月份和星期的缩写‌

  • 月份:JAN, FEB, MAR… DEC
  • 星期:SUN, MON, TUE… SAT
  1. L 和 W 的组合‌
  • LW 表示当月的最后一个工作日。
  • L-3 表示倒数第3天。‌
  1. 年份字段(可选)‌
  • Spring 的 @ScheduChina编程led ‌不支持年份字段‌,需用6位表达式。

5. 动态与复杂场景‌

1‌. 动态 Cron 表达式‌

  • Spring 中可通过 @Scheduled(cron = “${cron.expression}”) 从配置文件读取。
  • 结合数据库动态更新任务:
@Scheduled(cron = "#{@cronService.getCronExpression()}")
public void dynamicTask() {
    // 业务逻辑
}

2‌. 避开整点任务高峰‌

  • 添加随机延迟(避免多个任务同时触发):
@Scheduled(cron = "0 #{T(Java.util.concurrent.ThreadLocalRandom).current().nextInt(55)} * * * ?")
public void randomMinuteTask() {
    // 每小时随机分钟执行
}

3‌. 闰年处理‌

  • Cron 无法直接处理闰年,需结合代码逻辑判断。

6. 调试与验证‌

www.chinasem.cn

1‌. 在线工具‌

  • Crontab Guru:快速验证表达式。
  • CronMaker:生成表达式并查看下次执行时间。
  1. 日志调试‌
  • 在任务方法中添加日志,观察触发时间是否符合预期:
@Scheduled(cron = "0 0/5 * * * ?")
public void loChina编程gTask() {
    log.info("任务执行时间: {}", LocalDateTime.now());
}

7. 常见问题‌

‌1. 为什么任务没有执行?‌

  • 检查是否添加 @EnableScheduling
  • 检查 Cron 表达式是否正确(如 Spring 不支持年份字段)。
  • 检查时区设置(默认使用服务器时区,可通过 zone 属性修改)。

‌2. 如何实现每隔 N 天执行?‌

  • 方案1:使用 0 0 0 */N * ?(如 0 0 0 */5 * ? 每隔5天执行)。
  • 方案2:通过代码记录上一次执行时间。

‌3. 分布式环境下的幂等性‌

使用 Redis 分布式锁:

@Scheduled(cron = "0 0 * * * ?")
public void distributedTask() {
    if (redisLock.tryLock("taskLock", 10)) {
        try {
            // 业务逻辑
        } finally {
            redisLock.unlock("taskLock");
        }
    }
}

总结‌

Cron China编程表达式通过简洁的语法实现了灵活的定时规则,但需注意 ‌字段互斥性‌ 和 ‌特殊字符的适用场景‌。

在复杂业务中,可结合动态配置、分布式锁和日志监控来确保任务稳定执行。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程China编程(www.chinasem.cn)。

这篇关于SpringBoot @Scheduled Cron表达式使用方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Spring Security常见问题及解决方案

《SpringSecurity常见问题及解决方案》SpringSecurity是Spring生态的安全框架,提供认证、授权及攻击防护,支持JWT、OAuth2集成,适用于保护Spring应用,需配置... 目录Spring Security 简介Spring Security 核心概念1. ​Securit

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

SpringBoot+EasyPOI轻松实现Excel和Word导出PDF

《SpringBoot+EasyPOI轻松实现Excel和Word导出PDF》在企业级开发中,将Excel和Word文档导出为PDF是常见需求,本文将结合​​EasyPOI和​​Aspose系列工具实... 目录一、环境准备与依赖配置1.1 方案选型1.2 依赖配置(商业库方案)二、Excel 导出 PDF

SpringBoot改造MCP服务器的详细说明(StreamableHTTP 类型)

《SpringBoot改造MCP服务器的详细说明(StreamableHTTP类型)》本文介绍了SpringBoot如何实现MCPStreamableHTTP服务器,并且使用CherryStudio... 目录SpringBoot改造MCP服务器(StreamableHTTP)1 项目说明2 使用说明2.1

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

Spring Boot Maven 插件如何构建可执行 JAR 的核心配置

《SpringBootMaven插件如何构建可执行JAR的核心配置》SpringBoot核心Maven插件,用于生成可执行JAR/WAR,内置服务器简化部署,支持热部署、多环境配置及依赖管理... 目录前言一、插件的核心功能与目标1.1 插件的定位1.2 插件的 Goals(目标)1.3 插件定位1.4 核

如何使用Lombok进行spring 注入

《如何使用Lombok进行spring注入》本文介绍如何用Lombok简化Spring注入,推荐优先使用setter注入,通过注解自动生成getter/setter及构造器,减少冗余代码,提升开发效... Lombok为了开发环境简化代码,好处不用多说。spring 注入方式为2种,构造器注入和setter