Spring 定时任务:@Scheduled 注解四大参数解析

ops/2025/1/24 3:35:15/

本文主要介绍了在 Spring 框架中使用@Scheduled注解实现定时任务的方法,重点讲解了fixedRate、fixedDelay、cron和initialDelay这四个参数的用法,并通过实例代码进行了详细说明。
在这里插入图片描述

1. fixedRate 参数

参数含义

fixedRate指定任务固定时间间隔执行。如设为 3000 毫秒(3 秒),第一次任务启动后,后续任务每隔 3 秒尝试启动,不考虑前次任务是否完成。

示例代码

创建一个简单的 Spring Boot 项目,并在主类上添加@SpringBootApplication注解以启用 Spring Boot 自动配置。

java">import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling // 启用定时任务功能
public class ScheduledDemoApplication {public static void main(String[] args) {SpringApplication.run(ScheduledDemoApplication.class, args);}
}

创建一个定时任务类,doTask方法被@Scheduled注解修饰,fixedRate设置为 3000 毫秒。在方法内部,我们首先打印出执行次数和当前时间,然后通过Thread.sleep模拟任务执行耗时 5 秒。运行应用程序后,你会发现尽管任务执行时间超过了 3 秒,但每隔 3 秒就会有一次新的任务尝试启动,导致任务会重叠执行。

java">import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class FixedRateTask {private int count = 0;@Scheduled(fixedRate = 3000)public void doTask() {System.out.println("FixedRateTask - 执行次数: " + (++count) + ",当前时间: " + System.currentTimeMillis());try {// 模拟任务执行耗时 5 秒Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}
}

2. fixedDelay 参数

参数含义

fixedRate不同,fixedDelay参数关注的是上一次任务执行完成后的延迟时间。也就是说,只有当上一次任务彻底结束后,才会开始计算固定的延迟时间,之后才启动下一次任务。例如,设置fixedDelay = 3000毫秒,那么在上一次任务完成后,会等待 3 秒才开始下一次任务。

示例代码

创建一个FixedDelayTask类,doTask方法的fixedDelay设置为 3000 毫秒,任务模拟执行耗时 2 秒。运行后可以看到,每次任务执行完成后,会等待 3 秒才开始下一次任务,任务不会重叠执行。

java">import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class FixedDelayTask {private int count = 0;@Scheduled(fixedDelay = 3000)public void doTask() {System.out.println("FixedDelayTask - 执行次数: " + (++count) + ",当前时间: " + System.currentTimeMillis());try {// 模拟任务执行耗时 2 秒Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}
}

3. cron 参数

参数含义

cron参数提供了一种高度灵活的定时任务执行时间设置方式。它基于 cron 表达式,该表达式由 6 个或 7 个字段组成,分别对应秒、分钟、小时、日、月、星期(星期可以用数字 0 - 6 表示,其中 0 或 7 代表星期日)以及可选的年。通过合理组合这些字段的值,可以精确地定义任务在何时执行。

示例代码

创建一个CronTask类,cron表达式"0 0/5 * * * *"表示每隔 5 分钟执行一次任务。例如,任务可能在 10:00:00、10:05:00、10:10:00 等时间点执行。:

java">import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class CronTask {@Scheduled(cron = "0 0/5 * * * *")public void doTask() {System.out.println("CronTask - 执行时间: " + System.currentTimeMillis());}
}

4. initialDelay 参数

参数含义

initialDelay参数用于指定定时任务在应用启动后首次执行的延迟时间。它可以与fixedRatefixedDelaycron等参数结合使用,以便在应用启动后等待一段时间再开始执行定时任务。

示例代码

创建一个InitialDelayTask类,、fixedRate设置为 3000 毫秒,initialDelay设置为 5000 毫秒。这意味着应用启动后,会先等待 5 秒,然后才开始按照每 3 秒的固定间隔执行任务。

java">import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class InitialDelayTask {private int count = 0;@Scheduled(fixedRate = 3000, initialDelay = 5000)public void doTask() {System.out.println("InitialDelayTask - 执行次数: " + (++count) + ",当前时间: " + System.currentTimeMillis());}
}

5. 总结

  • 对于一些对实时性要求较高且执行时间较短的任务,可以考虑使用fixedRate
  • 对于执行时间较长且不希望任务重叠的任务,fixedDelay可能更为合适;
  • 对于需要在特定时间点或按照复杂时间规则执行的任务,cron表达式则是不二之选。
  • initialDelay参数可以帮助我们更好地控制任务的启动时间,避免在应用启动初期因大量任务同时启动而带来的性能压力。

http://www.ppmy.cn/ops/152643.html

相关文章

react上增加错误边界 当存在错误时 不会显示白屏

react上增加错误边界 当存在错误时 不会显示白屏 定义:错误边界是一个 React 组件,它会在其子组件树中的任何位置捕获 JavaScript 错误,并显示一个备用的 UI 而不是崩溃的组件树 在总项目的组件中创建文件: src/components/Erro…

【Elasticsearch入门到落地】6、索引库的操作

接上篇《5、安装IK分词器》 上一篇我们进行了IK分词器的安装与测试,本篇我们来学习ElasticSearch的索引库的操作,学习mapping映射属性以及CRUD操作。 一、前情回顾 我们在前几篇学习了ElasticSearch的基本概念,并动手搭建了ElasticSearch环…

字玩FontPlayer开发笔记12 Vue3撤销重做功能

字玩FontPlayer开发笔记12 Vue3撤销重做功能 字玩FontPlayer是笔者开源的一款字体设计工具,使用Vue3 ElementUI开发,源代码:github | gitee 笔记 撤销重做功能是设计工具必不可少的模块,以前尝试使用成熟的库实现撤销重做功能…

探索前端开发中的 Web Vitals —— 提升用户体验的关键技术

随着用户对网站性能的要求越来越高,前端开发不仅需要关注功能实现,还需要关注页面加载速度、交互响应速度以及视觉稳定性等因素。Google 在 2020 年推出了 Web Vitals(网页核心指标),这套指标为前端开发者提供了一种衡…

数据结构(精讲)----应用篇

注意:作者会出两个版本的数据结构的介绍;第一个版本介绍的数据结构会偏向理论性,第二个版本,也就是从这篇文章开始,这个版本会偏向应用性;会带领大家了解数据结构,以及为什么学习数据结构&#…

Windows截获系统鼠标消息转发到指定窗口

注册输入设备,截获系统底层的设备消息 先看关键代码: RAWINPUTDEVICE rids[1]; rids[0].usUsagePage HID_USAGE_PAGE_GENERIC; //0x01 rids[0].usUsage HID_USAGE_GENERIC_MOUSE; //0x02 rids[0].dwFlags RIDEV_INPUTSINK; //0x00000100 rids[0].hwn…

图论DFS:黑红树

我的个人主页 {\large \mathsf{{\color{Red} 我的个人主页} } } 我的个人主页 往 {\color{Red} {\Huge 往} } 往 期 {\color{Green} {\Huge 期} } 期 文 {\color{Blue} {\Huge 文} } 文 章 {\color{Orange} {\Huge 章}} 章 DFS 算法:记忆化搜索DFS 算法&#xf…

【Unity】ScrollViewContent适配问题(Contentsizefilter不刷新、ContentSizeFilter失效问题)

最近做了一个项目,菜单栏读取数据后自动生成,结果用到了双重布局 父物体 尝试了很多方式,也看过很多大佬的文章,后来自己琢磨了一下,当子物体组件自动生成之后,使用以下以下代码效果会好一些: …