Spring Boot开启定时任务的三种方式 【@EnableScheduling注解,SchedulingConfigurer接口,Quartz 框架】

Spring Boot 开启定时任务的三种方式​

在这里插入图片描述

在 Spring Boot 应用开发过程中,定时任务是十分常见的需求,比如定时清理日志文件、定期备份数据库数据、定时发送邮件提醒等。Spring Boot 提供了多种开启定时任务的方式,本文将详细介绍三种常见的实现方式,并通过代码示例帮助大家理解和应用。​

一、基于注解驱动的定时任务​

基于注解驱动的定时任务是 Spring Boot 中最简洁、最常用的方式,通过@EnableScheduling和@Scheduled两个注解即可快速实现。​

  1. 启用定时任务​
    在 Spring Boot 的主应用类上添加@EnableScheduling注解,用于开启定时任务功能。示例如下:​
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.scheduling.annotation.EnableScheduling;​
​
@SpringBootApplication@EnableSchedulingpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
  1. 定义定时任务​
    在需要执行定时任务的方法上添加@Scheduled注解,并指定任务执行的时间表达式。@Scheduled支持多种时间设定方式,常用的有:​
    fixedRate:以固定频率执行任务,单位为毫秒,即上一次任务开始执行到下一次任务开始执行的时间间隔。​
    fixedDelay:上一次任务执行完毕到下一次任务开始执行的时间间隔,单位为毫秒。​
    cron:使用 cron 表达式来定义任务执行的时间,灵活性更高。​
    下面是一个使用cron表达式的示例,该任务会在每分钟的第 10 秒执行:​
import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;​
​
@Componentpublic class ScheduledTaskExample {@Scheduled(cron = "10 * * * * *")public void executeTask() {System.out.println("定时任务执行中...");}}
  1. 优缺点分析​
    优点:实现简单,代码侵入性小,适合简单的定时任务场景。​
    缺点:时间表达式的设置相对固定,对于复杂的定时需求,如动态修改任务执行时间,支持不够灵活。​

二、实现接口方式​

除了注解驱动,我们还可以通过实现SchedulingConfigurer接口来自定义定时任务的调度规则,这种方式能更灵活地控制任务的调度。​

  1. 实现接口​
    创建一个配置类,实现SchedulingConfigurer接口,并实现其configureTasks方法。在该方法中,通过ScheduledTaskRegistrar来注册定时任务。示例代码如下:​
import org.springframework.context.annotation.Configuration;import org.springframework.scheduling.annotation.SchedulingConfigurer;import org.springframework.scheduling.config.ScheduledTaskRegistrar;import org.springframework.scheduling.support.CronTrigger;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;​
​
@Configurationpublic class CustomSchedulingConfig implements SchedulingConfigurer {@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();​taskRegistrar.setScheduler(executorService);​taskRegistrar.addTriggerTask(() -> System.out.println("通过接口方式执行的定时任务"),​triggerContext -> new CronTrigger("20 * * * * *").nextExecutionTime(triggerContext));}}

  1. 原理说明​
    在上述代码中,ScheduledTaskRegistrar负责管理和注册定时任务,我们可以自定义线程池,并且通过addTriggerTask方法传入任务执行逻辑和触发规则。这种方式相比注解驱动,能更精细地控制任务的执行线程、触发逻辑等。​

  2. 适用场景​
    当需要对任务的调度进行更复杂的配置,如使用自定义线程池、动态调整任务执行时间等场景时,实现SchedulingConfigurer接口的方式更为合适。​

三、基于 Quartz 框架的定时任务​

Quartz 是一个功能强大且灵活的开源任务调度框架,Spring Boot 也提供了对 Quartz 的集成支持。使用 Quartz 可以实现更复杂的任务调度需求,如任务的持久化、集群调度等。​

  1. 添加依赖​
    在pom.xml文件中添加 Quartz 的依赖:​
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>
  1. 定义 Job 类​
    创建一个类继承QuartzJobBean,并实现executeInternal方法,该方法中编写具体的任务逻辑。示例如下:​
import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.springframework.scheduling.quartz.QuartzJobBean;​
​
public class MyQuartzJob extends QuartzJobBean {@Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {System.out.println("基于Quartz框架的定时任务执行中...");}}


3. 配置任务调度​
创建一个配置类,用于配置JobDetail和Trigger,指定任务的执行逻辑和触发规则。示例代码如下:​

import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.SimpleScheduleBuilder;import org.quartz.Trigger;import org.quartz.TriggerBuilder;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;​
​
@Configurationpublic class QuartzConfig {@Beanpublic JobDetail jobDetail() {return JobBuilder.newJob(MyQuartzJob.class).withIdentity("myJob").storeDurably().build();}​
​@Beanpublic Trigger trigger() {return TriggerBuilder.newTrigger().forJob(jobDetail()).withIdentity("myTrigger").withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(30).repeatForever()).build();}}
  1. 优势与应用场景​
    优势:Quartz 提供了丰富的功能,支持任务的持久化存储,即使应用重启,任务也能按照原有计划继续执行;同时,Quartz 还支持集群环境下的任务调度,适用于分布式系统。​
    应用场景:在对任务调度有高可靠性、高灵活性要求的场景,如电商系统的订单定时处理、金融系统的账务清算等,Quartz 框架是一个很好的选择。​

总结​

本文介绍了 Spring Boot 开启定时任务的三种方式:基于注解驱动的简单方式、通过实现接口的灵活方式以及基于 Quartz 框架的强大方式。每种方式都有其特点和适用场景,在实际开发中,我们可以根据具体的业务需求选择合适的方式来实现定时任务。​
当任务逻辑简单、对灵活性要求不高时,注解驱动方式能快速满足需求;如果需要对任务调度进行更多自定义配置,实现接口方式更为合适;而对于复杂的任务调度需求,如任务持久化、集群调度等,Quartz 框架则是最佳选择。​
希望通过本文的介绍,大家能更好地掌握 Spring Boot 中定时任务的实现方法,在项目开发中灵活运用这些技术,提升应用的功能和效率。​
如果你在使用这些方式实现定时任务的过程中遇到问题,或者想了解更多关于 Spring Boot 的进阶知识,欢迎在评论区留言交流。同时,推荐阅读Spring Boot 官方文档获取更多相关内容 。

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

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

相关文章

LLM 编码器 怎么实现语义相关的 Token 向量更贴近? mask训练:上下文存在 ;; 自回归训练:只有上文,生成模型

LLM 编码器 怎么实现语义相关的 Token 向量更贴近? 目录 LLM 编码器 怎么实现语义相关的 Token 向量更贴近?mask训练:上下文存在自回归训练:只有上文,生成模型一、核心机制:损失函数与反向传播的“语义校准”1. 损失函数的“语义约束”2. 嵌入层参数的“动态调整”二、关…

从OCR瓶颈到结构化理解来有效提升RAG的效果

当人们探讨如何让人工智能系统更好地从文档中查找和使用信息时&#xff0c;通常关注的是令人瞩目的算法和前沿的大型语言模型。但问题是&#xff1a;如果文本提取的质量很差&#xff0c;那么后续的努力都将付诸东流。本文探讨OCR质量如何影响检索增强生成&#xff08;RAG&#…

SpringBoot -- 整合Junit

11.SpringBoot 整合 Junit 11.1 为什么需要单元测试 由于在SpringBoot开发过程中&#xff0c;每开发一个模块&#xff0c;有时需要从 controller、service、mapper 到甚至 xml 文件的编写全部开发完毕才能进行测试&#xff0c;这是十分浪费时间的&#xff0c;比如开发人员想测…

虚拟机远程连接编译部署QT程序

概要 逻辑 我们需要凑齐 QT库、交叉编译工具、sysroot这三大件。 交叉编译的程序是部署到板卡环境运行,需要构建和板卡一样的库环境。 sysroot是我们在虚拟机上自己命名的一个文件夹,包含开发板的运行系统所需的所有文件。 虚拟机是x64版本,开发板是arm64版本。 如果开发板…

基于SpringBoot的智慧旅游系统

以智慧旅游系统的设计与实现为研究对象&#xff0c;旨在通过科技手段提升旅游业的管理效能和游客体验。在系统设计方面&#xff0c;深入分析了地理特征、丰富的文化底蕴以及多样的自然景观。结合这些独特之处&#xff0c;构建了一个多层次的旅游管理系统&#xff0c;包括景点信…

下载最新版本的OpenOCD

Download OpenOCD for Windowsd&#xff1a; https://gnutoolchains.com/arm-eabi/openocd/

Geollama 辅助笔记:raw_to_prompt_strings_geo.py

1 GeoLifePreprocessingDF 1.1 创造函数 1.2 读取原始数据 读取这个DataFrame 1.3 处理原始DataFrame 1.4 生成对应prompt 1.5 打乱轨迹 1.6 打乱轨迹里面的事件

TDengine 如何打破工业实时数据库势力边界?

打破工业实时数据库势力边界&#xff0c;TDengine 时序数据库与工业 SCADA 深度融合 随着 时序数据库&#xff08;Time Series Database&#xff09;的日益普及&#xff0c;越来越多的工业自动化控制&#xff08;工控&#xff09;人员开始认识到其强大能力。然而&#xff0c;时…

渗透靶场:事件和属性被阻止的反射xss

本关很多标签被拦截了&#xff0c;需要使用 burp 模糊测试哪个标签可以用 <a>和<animate>可以使用&#xff0c;<animate>是<svg>标签中用来给动画设定属性的&#xff0c;看看<svg>可不可用 利用<svg>、<animate>、<a>来构造 这…

STM32中Usart的使用

目录 一、USART简介 1.电平标准 2.通信接口 3.硬件电路 4.串口参数以及时序 5.串口时序 二、USART结构介绍 1.USART功能框图 ​编辑 1.1 功能引脚 1.2 数据寄存器 1.3 控制器 1.4 波特率发生器 1.5简化结构图 2.数据帧 一、USART简介 USART&#xff08;Universa…

鸿蒙HarmonyOS 5小游戏实践:数字记忆挑战(附:源代码)

数字记忆挑战游戏&#xff1a;打造提升大脑记忆力的鸿蒙应用 在当今数字时代&#xff0c;人们的记忆力面临着前所未有的挑战。从日常的待办事项到复杂的工作任务&#xff0c;强大的记忆力都是提高效率和表现的关键。本文将介绍一款基于鸿蒙系统开发的数字记忆挑战游戏&#xf…

记录一个C#/.NET的HTTP工具类

记录一个C#/.NET的HTTP工具类 using Serilog; using System.Net; using System.Text; using System.Text.Json;namespace UProbe.Common.Comm.Http {public class HttpClientHelper{/// <summary>/// 发送HttpGet请求/// </summary>/// <typeparam name"T…

深度学习:PyTorch卷积神经网络之图像入门

本文目录&#xff1a; 一、二值图像二、**灰度图像*三、**索引图像**四、**真彩色RGB图像****星空图** 前言&#xff1a;这篇文章开始讲解CNN&#xff0c;此前讲解的人工神经网络&#xff08;ANN&#xff09;如果有小伙伴还不清楚&#xff0c;一定要多看&#xff0c;多练习&…

PyTorch RNN实战:快速上手教程

PyTorch实现RNN的实例 以下是一个使用PyTorch实现RNN的实例代码,包含数据准备、模型定义、训练和评估步骤。 RNN流程图 RNN流程图,在使用t来表示当前时间点(序列中的第t项),RNN接收所有先前内容得单一个表示h和关于序列最新项的信息,RNN将这些信息合并到迄今为止所有看…

C++项目快速配置SQLite

前言&#xff1a;完全没接触过数据库&#xff0c;但老师课程设计要求数据存储在数据库怎么办&#xff1f;&#xff1f;&#xff1f;主包看了些网络上的资源&#xff0c;觉得讲得都不是很能快速上手&#xff0c;所以决定自己写一篇博客 SQLiteCpp是一个基于 C 封装的 SQLite 操…

ArcGIS中对输入面图层A的相交问题批量处理的实现方法

一、背景及意义 在各种数据建库中&#xff0c;拓扑错误是必须处理的&#xff0c;其中最常见的是重叠问题&#xff0c;我们常用拓扑工具来检查重叠&#xff0c;但是由于拓扑工具只能作为检查且不能批量修改&#xff0c;此时我们可以使用“相交”工具来检查出重叠部分&#xff0…

【学习笔记】3.3 Decoder-Only PLM

参考资料&#xff1a;https://github.com/datawhalechina/happy-llm Decoder-Only是当前大型语言模型&#xff08;LLM&#xff09;的基础架构&#xff0c;如 GPT 系列。GPT 是 Decoder-Only 架构的代表&#xff0c;而开源 LLM 如 LLaMA 也是在 GPT 架构基础上发展而来的。 3…

主流的Attention Backend介绍

Attention Backend 技术背景 注意力&#xff08;Attention&#xff09;机制在深度学习中扮演着关键角色&#xff0c;它帮助模型在处理序列数据时&#xff0c;有选择地关注输入中的重要信息。然而&#xff0c;传统的注意力计算往往受到内存访问和算力分配的双重制约&#xff0c…

Linux内存取证

我们先把linux取证文件放到kali中&#xff0c;然后这里的Ubuntu18.04-5.4.0-84-generic.zip需要不解压直接放到vol工具中 然后把Ubuntu18.04-5.4.0-84-generic放到vol工具中&#xff0c;然后开始去这个&#xff0c;使用vol工具查看linux的版本信息 这个LinuxUbuntu18_04-5_4_0-…

使用docx4j 实现word转pdf(linux乱码处理)

由于系统之前使用了是itext进行转换的&#xff0c;现在已经不是开源的工具了&#xff0c;需要收费&#xff0c;然后进行改造&#xff0c;具体处理如下。 <dependency><groupId>org.docx4j</groupId><artifactId>docx4j</artifactId><version…