Spring Boot中的@Scheduled注解:定时任务的原理与实现

1. 前言

本文将详细探讨Spring Boot中@Scheduled注解的使用,包括其原理、实现流程、步骤和代码示例。通过本文,读者将能够了解如何在Spring Boot应用中轻松创建和管理定时任务。

2. @Scheduled注解简介

在Spring框架中,@Scheduled注解用于标记一个方法,使其能够在固定的时间间隔内自动执行。这个注解主要基于Java的内置Timer类以及Quartz等定时任务库,但在Spring Boot中,它提供了更加简洁和易用的方式来实现定时任务。

2.1 实现原理

@Scheduled注解的实现原理主要依赖于Spring框架的任务调度机制。当Spring容器启动时,它会扫描所有带有@Scheduled注解的方法,并将它们注册到任务调度器中。任务调度器会根据注解中指定的时间间隔或Cron表达式来触发相应的方法执行。

2.2 注解参数详解

@Scheduled注解支持多个参数,用于精确控制任务的执行时间。这些参数包括:

  • cron:一个Cron表达式,用于指定任务的执行计划。它包含秒、分、小时、日、月、周等字段。
    在这里插入图片描述

  • zone:指定任务执行时使用的时区。默认为空,表示使用服务器所在时区。

  • fixedRate:两次任务执行之间的固定速率,单位为毫秒。

  • fixedDelay:上一次任务执行完成后到下一次任务执行开始的固定延迟,单位为毫秒。

这些参数可以根据需要灵活配置,以满足不同的定时任务需求。

3. 使用@Scheduled

3. 1添加依赖

首先,确保在项目的pom.xml文件中添加了Spring Boot的starter依赖。

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter</artifactId>  
</dependency>

3.2 启用定时任务

在Spring Boot的主类或者配置类上添加@EnableScheduling注解,以启用定时任务功能。

@SpringBootApplication  
@EnableScheduling  
public class MyApplication {  public static void main(String[] args) {  SpringApplication.run(MyApplication.class, args);  }  
}

3.3 创建定时任务

在需要执行定时任务的方法上添加@Scheduled注解,并指定执行时间。例如,下面的方法将在每天的固定时间执行。

import org.springframework.scheduling.annotation.EnableScheduling;  
import org.springframework.scheduling.annotation.Scheduled;  
import org.springframework.stereotype.Component;  @EnableScheduling  
@Component  
public class MyScheduledTasks {  // 使用cron表达式定义定时任务,每天中午12点执行  @Scheduled(cron = "0 0 12 * * ?")  public void taskWithCron() {  System.out.println("使用cron表达式定义的定时任务执行了,当前时间是:" + System.currentTimeMillis());  }  // 使用zone参数指定时区,每天中午12点(纽约时区)执行  @Scheduled(cron = "0 0 12 * * ?", zone = "America/New_York")  public void taskWithCronAndZone() {  System.out.println("使用cron表达式和时区定义的定时任务执行了,当前时间是:" + System.currentTimeMillis());  }  // 使用fixedRate参数定义定时任务,每隔5秒执行一次  @Scheduled(fixedRate = 5000)  public void taskWithFixedRate() {  System.out.println("使用fixedRate定义的定时任务执行了,当前时间是:" + System.currentTimeMillis());  }  // 使用fixedDelay参数定义定时任务,上一次任务执行完成后延迟3秒再执行下一次  @Scheduled(fixedDelay = 3000)  public void taskWithFixedDelay() {  try {  // 模拟任务执行耗时  Thread.sleep(2000);  } catch (InterruptedException e) {  e.printStackTrace();  }  System.out.println("使用fixedDelay定义的定时任务执行了,当前时间是:" + System.currentTimeMillis());  }  // 模拟一个耗时任务  public void simulateLongRunningTask() {  try {  Thread.sleep(5000);  } catch (InterruptedException e) {  e.printStackTrace();  }  System.out.println("模拟耗时任务执行完成");  }  
}

在这个示例中,我们创建了一个名为MyScheduledTasks的组件,并且在该组件中定义了四个定时任务方法。每个方法都使用了不同的@Scheduled参数来定义任务的执行计划。

  • taskWithCron方法使用cron参数来指定任务在每天的中午12点执行。
  • taskWithCronAndZone方法不仅使用了cron参数,还使用了zone参数来指定任务的执行时区为纽约时区。
  • taskWithFixedRate方法使用fixedRate参数来指定任务每隔5秒执行一次。注意,这里的固定速率是指从任务开始到下一次任务开始之间的时间间隔。
  • taskWithFixedDelay方法使用fixedDelay参数来指定上一次任务执行完成后延迟3秒再执行下一次。这里的固定延迟是指上一次任务执行完成到下一次任务开始之间的时间间隔。

在实际应用中,你可以根据需要选择合适的参数来定义定时任务,并且可以在方法内部编写实际的业务逻辑。此外,请确保在Spring Boot的启动类或配置类上添加了@EnableScheduling注解来启用定时任务功能。

4. 总结

通过本文的介绍,我们了解了Spring Boot中@Scheduled注解的使用方法和原理。通过简单的注解和配置,我们可以轻松地在Spring Boot应用中实现定时任务功能。在实际开发中,我们可以根据业务需求灵活调整任务的执行频率和参数,以满足不同的场景需求。

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

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

相关文章

《Python 语音转换简易速速上手小册》第5章 音频数据处理(2024 最新版)

文章目录 5.1 音频数据的基本处理5.1.1 基础知识5.1.2 主要案例&#xff1a;音频剪辑工具案例介绍案例 Demo案例分析 5.1.3 扩展案例 1&#xff1a;自动音量调节器案例介绍案例 Demo案例分析 5.1.4 扩展案例 2&#xff1a;语音识别预处理案例介绍案例 Demo案例分析 5.2 使用 Py…

手把手教您安装2024最新版微信消息防撤回插件

文章目录 &#x1f4d6; 介绍 &#x1f4d6;&#x1f3e1; 环境 &#x1f3e1;&#x1f4d2; 使用方法 &#x1f4d2;&#x1f4dd; 步骤一&#x1f4dd; 步骤二 ⚓️ 相关链接 ⚓️ &#x1f4d6; 介绍 &#x1f4d6; 本文与大家分享一个大神开发的2024最新版本的微信消息防撤…

Tomcat 学习之 Servlet

目录 1 Servlet 介绍 2 创建一个 Servlet 3 web.xml 介绍&#xff08;不涉及 filter 和 listener 标签&#xff09; 3.1 display-name 3.2 welcome-file-list 3.3 servlet 3.4 session-config 3.5 error-page 4 Tomcat 如何根据 URL 定位到 Servlet 5 执行 Servlet …

不破不立,那些年错过的Python

随着OpenAI的发展&#xff0c;Python的重要性不言而喻。不知你是否和我一样&#xff0c;不知道曾经说过多少次我要学Python&#xff0c;都没有执行起来… 近期我在知识库中更新了一波Python教程&#xff0c;选取了这一篇分享给大家。 前言 很多时候我们需要让程序变成交互性的…

Linux系统——nginx服务介绍

一、Nginx——高性能的Web服务端 Nginx的高并发性能优于httpd服务 1.nginx概述 Nginx是由1994年毕业于俄罗斯国立莫斯科鲍曼科技大学的同学为俄罗斯rambler.ru公司开发的&#xff0c;开发工作最早从2002年开始&#xff0c;第一次公开发布时间是2004年10月4日&#xff0c;版本…

第二证券:美国加息对中国股市的影响?美联储加息利好还是利空股市?

美国加息是一种紧缩的钱银政策&#xff0c;会招引出资者添加银行的出资&#xff0c;导致社会上的流动钱银减少&#xff0c;然后间接地导致股市流动资金减少&#xff0c;股市跌落&#xff0c;引起商场上的出资者恐慌&#xff0c;大量卖出&#xff0c;添加商场上的空方力量&#…

电路设计(25)——4位数字频率计的multism仿真及PCB设计

1.设计要求 使用4位数码管&#xff0c;显示输入信号的频率。完成功能仿真后&#xff0c;用AD软件&#xff0c;画出原理图以及PCB。 2.电路设计 输入信号的参数为&#xff1a; 可见&#xff0c;输入为168HZ&#xff0c;测量值为170HZ&#xff0c;误差在可接受的范围内。 3.PCB设…

分享Video.js观看Web视频流

界面效果 HTML结构 <div class"homePopup" ><div class"search_box animate__animated animate__fadeInDown" style"display: none;"><div class"van-search" style"background: rgba(0, 0, 0, 0);">&…

[服务器-数据库]MongoDBv7.0.4不支持ipv6访问

文章目录 MongoDBv7.0.4不支持ipv6访问错误描述问题分析错误原因解决方式 MongoDBv7.0.4不支持ipv6访问 错误描述 报错如下描述 Cannot connect to MongoDB.No suitable servers found: serverSelectionTimeoutMS expired: [failed to resolve 2408]问题分析 首先确定其是…

Android14 InputManager-InputReader的处理

IMS启动时会调用InputReader.start()方法 InputReader.cpp status_t InputReader::start() {if (mThread) {return ALREADY_EXISTS;}mThread std::make_unique<InputThread>("InputReader", [this]() { loopOnce(); }, [this]() { mEventHub->wake(); });…

Java SE 入门到精通—基础语法【Java】

敲重点&#xff01; 本篇讲述了比较重要的基础&#xff0c;是必须要掌握的 1.程序入口 在Java中&#xff0c;main方法是程序的入口点&#xff0c;是JVM&#xff08;Java虚拟机&#xff09;执行Java应用程序的起始点。 main方法的方法签名必须遵循下面规范&#xff1a; publ…

【力扣白嫖日记】1987.上级经理已离职的公司员工

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1978.上级经理已离职的公司员工 表&#xff1a;Employees 列名类型employee_idintnamevarcharmanager_idint…

DTV的LCN功能介绍

文章目录 LCN简介LCN获取LCN Conflict LCN简介 Logical Channel Number&#xff08;LCN&#xff09;是数字电视系统中用于标识和组织频道的逻辑编号。LCN的目的是为了方便用户浏览和选择频道&#xff0c;使得数字电视接收设备能够根据这些逻辑编号对频道进行排序和显示。 LCN…

学习大数据所需的java基础(5)

文章目录 集合框架Collection接口迭代器迭代器基本使用迭代器底层原理并发修改异常 数据结构栈队列数组链表 List接口底层源码分析 LinkList集合LinkedList底层成员解释说明LinkedList中get方法的源码分析LinkedList中add方法的源码分析 增强for增强for的介绍以及基本使用发2.使…

【成都游戏业:千游研发之都的发展与机遇】

成都游戏业&#xff1a; 千游研发之都的发展与机遇 作为我国西部游戏产业的龙头&#xff0c;成都这座城市正在高速发展&#xff0c;目标是崛起成为千亿级游戏研发之都。多年来&#xff0c;在政策扶持、人才汇聚以及文化底蕴等助力下&#xff0c;成都游戏业已经形成完整的产业链…

MyBatis--02-1- MybatisPlus----条件构造器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言AbstractWrapper 条件构造器官网文档https://baomidou.com/pages/10c804/#abstractwrapper](https://baomidou.com/pages/10c804/#abstractwrapper)![在这里插入…

安全这么卷了吗?北京,渗透,4k,不包吃住,非实习

起初某HR找人发了条招聘信息 看到被卷到4k一个月被震惊到了 随后发布了朋友圈&#xff0c;引起来众多讨论 对此网友发表众多评价 越来越卷的工作现象确实是一个普遍存在的问题 另外&#xff0c;也可以考虑和雇主沟通&#xff0c; 寻求更合理的工作安排&#xff0c; 或者…

[ 2024春节 Flink打卡 ] -- Paimon

2024&#xff0c;游子未归乡。工作需要&#xff0c;flink coding。觉知此事要躬行&#xff0c;未休&#xff0c;特记 Flink 社区希望能够将 Flink 的 Streaming 实时计算能力和 Lakehouse 新架构优势进一步结合&#xff0c;推出新一代的 Streaming Lakehouse 技术&#xff0c;…

springboot访问webapp下的jsp页面

一&#xff0c;项目结构。 这是我的项目结构&#xff0c;jsp页面放在WEB-INF下的page目录下面。 二&#xff0c;file--->Project Structure,确保这两个地方都是正确的&#xff0c;确保Source Roots下面有webapp这个目录&#xff08;正常来说&#xff0c;应该本来就有&#…

Python in Visual Studio Code 2024年2月发布

排版&#xff1a;Alan Wang 我们很高兴地宣布 2024 年 2 月版 Visual Studio Code 的 Python 和 Jupyter 扩展已经推出&#xff01; 此版本包括以下公告&#xff1a; 默认安装的 Python 调试器扩展快速选择 Python 解释器中的“Create Environment”选项Jupyter 的内置变量查…