当前位置: 首页 > news >正文

Spring Schedule:Spring boot整合Spring Schedule实战讲解定时发送邮件的功能

🎉🎉欢迎光临,终于等到你啦🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 🚀

本专栏带你从Spring入门到入魔 

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽icon-default.png?t=N7T8http://suzee.blog.csdn.net/


简介

本篇详细讲解定时任务如何构建  文末有详细的实战案例 定时发送邮件 

目录

简介

介绍

定时任务调度技术是一种用于在预定时间或间隔时间执行任务的技术。

Spring中的定时任务调度模块简介

​编辑

Spring Schedule的基本用法

Cron表达式详解

​编辑

定时任务的参数和返回值处理

处理定时任务方法的返回值:

定时任务的错误处理与异常处理:

处理定时任务方法中的异常:

定时任务的错误处理策略:

配置多个定时任务:

并发执行多个定时任务:

控制定时任务的执行顺序:

实战案例:定时发送邮箱

去QQ邮箱

开启这个服务

介绍

定时任务调度技术是一种用于在预定时间或间隔时间执行任务的技术。

它允许开发人员根据特定的时间表安排任务的执行,可以是一次性任务或周期性任务。定时任务调度技术通常用于需要定期执行的任务,例如数据备份、定时报告生成、定时数据同步等。

Spring中的定时任务调度模块简介


定时任务调度技术提供了一种方便和可靠的方式来执行重复性或定期性的任务。它可以帮助开发人员自动化一些常规的任务,减少人工干预和减轻人力负担。

Spring Schedule的基本用法

需要在项目的 Maven 依赖中添加 Spring Schedule 的相关依赖项。可以在项目的 pom.xml 文件中添加以下依赖项:

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

然后,您需要在 Spring 配置文件中启用定时任务调度功能。可以通过在配置类上添加注解 @EnableScheduling 来启用定时任务调度。

  1. 创建定时任务方法:

在您的 Spring Bean 中创建一个方法,该方法将作为定时任务的执行体。可以通过在方法上添加注解 @Scheduled 来标识该方法是一个定时任务。

@Component
public class MyTask {@Scheduled(fixedDelay = 5000) // 每隔5秒执行一次public void doTask() {// 执行任务的逻辑}
}
  1. 配置定时任务执行时间表达式:

可以使用 @Scheduled 注解的属性来配置定时任务的执行时间表达式。例如,可以使用 fixedDelay 属性来指定任务的执行间隔时间,或者使用 cron 属性来指定任务的执行时间规则。

import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
@EnableScheduling
public class MyTask {// 固定延迟执行,每隔5秒执行一次@Scheduled(fixedDelay = 5000)public void fixedDelayTask() {System.out.println("Fixed delay task executed.");}// 固定频率执行,每隔3秒执行一次@Scheduled(fixedRate = 3000)public void fixedRateTask() {System.out.println("Fixed rate task executed.");}// Cron 表达式执行,每分钟的第30秒执行一次@Scheduled(cron = "30 * * * * *")public void cronTask() {System.out.println("Cron task executed.");}
}
  1. 运行定时任务:

当 Spring 应用启动时,定时任务将自动开始执行。您可以查看日志或其他输出来确认定时任务的执行情况。

定时任务的执行方式:

在 Spring Schedule 中,有几种常见的定时任务执行方式:

  • 固定延迟执行(fixedDelay):在当前任务完成后,等待一定的延迟时间后再次执行任务。
  • 固定频率执行(fixedRate):以固定的频率执行任务,不考虑任务的执行时间。
  • Cron 表达式执行:使用标准的 Cron 表达式配置任务的执行时间规则,可以实现更灵活的定时任务调度。
  • fixedDelayTask() 方法使用 @Scheduled(fixedDelay = 5000) 注解,配置了任务的执行间隔为每隔5秒执行一次。当任务执行完成后,会等待5秒再次执行。

  • fixedRateTask() 方法使用 @Scheduled(fixedRate = 3000) 注解,配置了任务的执行频率为每隔3秒执行一次。不考虑任务的执行时间,即使上一次任务还未完成,也会按照固定频率执行。

  • cronTask() 方法使用 @Scheduled(cron = "30 * * * * *") 注解,配置了任务的执行时间规则为每分钟的第30秒执行一次。使用标准的 Cron 表达式可以实现更灵活的定时任务调度。

Cron表达式详解

 

  1. 定时任务的参数和返回值处理

定时任务方法可以接受参数,并且可以有返回值。下面是对定时任务参数和返回值的处理方式的讲解:

  1. 传递参数给定时任务方法:

定时任务方法可以接受参数,您可以在方法的参数列表中声明所需的参数。例如,如果您希望定时任务方法接受一个字符串参数,可以按如下方式定义方法:

@Scheduled(fixedDelay = 5000)
public void myTask(String parameter) {// 使用接收到的参数执行任务逻辑
}

当定时任务被触发时,Spring Schedule 将自动将参数传递给定时任务方法。您可以根据需要在方法内部使用这些参数。

  1. 处理定时任务方法的返回值:

定时任务方法可以有返回值,但是返回值通常被忽略,因为定时任务的执行是异步的,没有实际的调用方来处理返回值。因此,通常情况下,定时任务方法的返回值应该为 void

定时任务的错误处理与异常处理:

在定时任务的执行过程中,可能会出现错误或异常。下面是对定时任务错误处理和异常处理的讲解:

  1. 处理定时任务方法中的异常:

如果定时任务方法中抛出了异常,Spring Schedule 将捕获这些异常并记录日志。默认情况下,异常不会向上层传播,也不会打断定时任务的执行。因此,您可以在定时任务方法中处理异常,例如进行异常日志记录或错误处理。

@Scheduled(fixedDelay = 5000)
public void myTask() {try {// 执行任务逻辑} catch (Exception e) {// 处理异常,例如记录日志或进行错误处理}
}
  1. 定时任务的错误处理策略:

如果您希望在定时任务方法抛出异常时中断任务的执行,并采取特定的错误处理策略,可以通过配置 @EnableScheduling 注解的 exceptionHandler 属性来实现。

@Configuration
@EnableScheduling(exceptionHandler = "myExceptionHandler")
public class MySchedulingConfig {@Beanpublic TaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(10);return scheduler;}public void myExceptionHandler(Throwable error) {// 错误处理逻辑,例如记录日志或发送通知}
}

在上述示例中,我们创建了一个名为 MySchedulingConfig 的配置类,并在其中配置了一个 TaskScheduler bean。通过在 @EnableScheduling 注解上指定 exceptionHandler 属性,将错误处理逻辑与定时任务调度器关联起来。

配置多个定时任务:

如果您需要配置多个定时任务,可以在同一个类中定义多个定时任务方法,或者创建多个带有定时任务注解的 Spring Bean。

@Component
public class MyTasks {@Scheduled(fixedDelay = 5000)public void task1() {// 执行任务1的逻辑}@Scheduled(cron = "0 0 12 * * ?")public void task2() {// 执行任务2的逻辑}
}

并发执行多个定时任务:

默认情况下,Spring Schedule 使用单个线程执行所有的定时任务。如果您需要并发执行多个定时任务,可以配置一个具有适当线程池大小的任务调度器。

@Configuration
@EnableScheduling
public class MySchedulingConfig {@Beanpublic TaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(10); // 设置线程池大小为10return scheduler;}
}

控制定时任务的执行顺序:

Spring Schedule 默认情况下不提供显式的控制定时任务执行顺序的方式。定时任务的执行顺序取决于任务调度器的实现和底层线程池的行为。

如果您需要在定时任务之间确保特定的执行顺序,可以考虑使用互斥或其他同步机制来实现。例如,您可以使用 synchronized 关键字或 Lock 接口来控制任务的互斥执行。

@Component
public class MyTasks {private final Object lock1 = new Object();private final Object lock2 = new Object();@Scheduled(fixedDelay = 5000)public void task1() {synchronized (lock1) {// 执行任务1的逻辑}}@Scheduled(fixedDelay = 5000)public void task2() {synchronized (lock2) {// 执行任务2的逻辑}}
}

实战案例:定时发送邮箱

首先引入依赖

dependency>groupId>org.springframework.bootgroupId>artifactId>spring-boot-starter-mailartifactId>
dependency>

去QQ邮箱

开启这个服务

自己收一下验证码 确认 就OK了

配置你的的基本配置

编写邮箱发送方法

@Component
@ConfigurationProperties(prefix = "email.config")
public class EmailUtil {@Resourceprivate StringRedisTemplate stringRedisTemplate;/*** 验证码长度*/private int codeLen=6;/*** 发送邮箱验证码的qq号*/private String qq;/*** 发送邮件的邮箱*/private String toSendEmail;/*** 发件人*/private String sender;/*** 开启IMAP/SMTP服务获取的授权码*/private String authPwd;/*** 邮件的主题*/private String title;/*** 邮件的内容*/private String content;@Scheduled(cron = "0 34 21 * * ?")public void SendEmail(String email){String authCode=RandomUtil.randomNumbers(6);stringRedisTemplate.opsForValue().set(LOGIN_CODE_KEY+email,authCode,10, TimeUnit.MINUTES);  //将验证码存入缓存,10分钟失效try {sendAuthCodeEmail(email,authCode);} catch (Exception e) {e.printStackTrace();return Result.fail("发送失败");}return Result.ok();}/*** 发送邮箱验证码* @param email* @param authCode*/public String sendAuthCodeEmail(String email, String authCode) {try {SimpleEmail mail = new SimpleEmail();mail.setHostName("smtp.qq.com");//发送邮件的服务器mail.setAuthentication(qq, authPwd);//第一个参数是发送邮箱验证码的qq号,第二个参数是开启IMAP/SMTP服务获取的授权码mail.setFrom(toSendEmail, sender);  //第一个参数是发送邮件的邮箱,第二个参数是发件人mail.setSSLOnConnect(true); //使用安全链接mail.addTo(email);//接收的邮箱mail.setSubject(title);//设置邮件的主题mail.setMsg(content + authCode);//设置邮件的内容mail.send();//发送} catch (EmailException e) {e.printStackTrace();}return ;}

最终效果 

相关文章:

Spring Schedule:Spring boot整合Spring Schedule实战讲解定时发送邮件的功能

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…...

Midjourney绘图欣赏系列(十)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…...

【C语言】人生重开模拟器

前言&#xff1a; 人生重开模拟器是前段时间非常火的一个小游戏&#xff0c;接下来我们将一起学习使用c语言写一个简易版的人生重开模拟器。 网页版游戏&#xff1a; 人生重开模拟器 (ytecn.com) 1.实现一个简化版的人生重开模拟器 &#xff08;1&#xff09; 游戏开始的时…...

船舶AIS监控网络-船位信息查询:实时查询船舶动态,服务于船舶安全航行管理、港口调度计划、物流、船代、货代。【AIS动态信息编写船舶轨迹】

文章目录 引言I 预备知识1.1 相关术语1.2 主要功能1.3 MongoDB和Es各自优势II 系统架构2.1 电子海图开源JavaScript包2.2 地图渲染库2.3 地图服务调用(天地图)2.4 在Elasticsearch(ES)中存储船舶轨迹数据III 数据同步方案3.1 基于 Binlog 实时同步3.2 数据迁移工具:Canal3.3…...

Axios 中的文件上传(Upload File)方法

Axios 提供了多种上传文件&#xff08;Upload File&#xff09;的方法&#xff0c;适用于不同的上传场景。以下是其中几种常用的方法&#xff1a; 1. 使用 FormData 对象FormData是一个用于创建表单数据的 API&#xff0c;可用于发送包含文件和其他表单数据的multipart/form-d…...

机试:数塔路径

问题描述: 代码示例: //数塔路径 #include <bits/stdc.h>using namespace std;int main(){ // 算法思想: // 逆推,将最下方和右下方的数字进行比较,哪个大则加上并更新,直至到根节点即为最大 int n;cin >> n; int nums[n1][n1]; // 输入数塔 for(int i 1;i < n…...

ROS2中launch编写及参数含义(xml、python)

ROS2系列文章目录 ROS2中nav_msgs/msg/Path 数据含义及使用 ROS2中std_msgs/msg/Header 数据含义及使用 ROS中TF变换详解 文章目录 ROS2系列文章目录ROS2中launch编写及参数含义&#xff08;xml、python&#xff09;一、ROS官方介绍二、实现案例1.编写主函数、CMakeLists.tx…...

鸿蒙Socket通信示例(TCP通信)

前言 DevEco Studio版本&#xff1a;4.0.0.600 参考链接&#xff1a;OpenHarmony Socket 效果 TCPSocket 1、bind绑定本地IP地址 private bindTcpSocket() {let localAddress resolveIP(wifi.getIpInfo().ipAddress)console.info("111111111 localAddress: " …...

yolov5-v6.0详细解读

yolov5-v6.0详细解读 一、yolov5版本介绍二、网络结构2.1 Backbone特征提取部分2.1.1 ConvBNSiLU模块2.1.2 C3模块2.1.2.1 BottleNeck模块 2.1.3 SPPF模块 2.2 Neck特征融合部分2.2.1 FPN2.2.2 PANet 2.3Head模块 三、目标框回归3.1 yolo标注格式3.2 yolov4目标回归框3.3 yolov…...

FPGA - 单总线协议(one-wire)

1&#xff0c;简介 单总线&#xff08;one-wire&#xff09;是美国 DALLAS 公司推出的外围串行扩展总线技术&#xff0c;与 SPI、I2C 等串行数据通信方式不同&#xff0c;它采用单根信号线&#xff0c;既传输时钟又传输数据&#xff0c;而且数据传输是双向的。它具有节省 I/O口…...

python的函数与类的定义

目录 1.函数 1.函数的定义 2.输入参数与输出参数的类型 3.输入和输出多个参数 1.普通参数 2.含有任意数量的参数 3.关键字参数 4.普通参数与多个参数的结合 2.类 1.类的定义 2.类的实例化 3.继承 1.函数 1.函数的定义 def 函数名(输入参数): 文档字符串 函数体 …...

Parade Series - WebRTC ( < 300 ms Low Latency ) T.B.D

Parade Series - FFMPEG (Stable X64) C:\Conda\parading-cam>ffmpeg -f dshow -i video"Surface Camera Front" -vcodec libx264 -preset:v ultrafast -tune:v zerolatency -an -rtsp_transport tcp -f rtsp://127.0.0.1:8554/cam0801...

【ARM】MDK在programming algorithm界面添加FLM

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 解决在programming algorithm界面中无法添加想要的Flash编程算法的问题 2、 问题场景 在对于Debug进行Flash Download进行配置的时候&#xff0c;在programming algorithm界面中有对应的Flash编程算法。可以通过…...

springmvc学习笔记1

springmvc学习笔记part1 总概述图创建步骤创建project并在父工程中导入配置类添加为web工程检查maven配置写handller方法写配置类SpringMVC环境搭建项目部署关键步骤总结 具体设置路径设置注解接收参数&#xff08;重点param参数接收路径参数接收json参数接收请求头接收和cooki…...

力扣106 从中序与后续遍历序列构造二叉树

文章目录 题目描述解题思路代码 题目描述 给定两个整数数组 inorder 和 postorder &#xff0c;其中 inorder 是二叉树的中序遍历&#xff0c; postorder 是同一棵树的后序遍历&#xff0c;请你构造并返回这颗 二叉树 。 示例 1: 输入&#xff1a;inorder [9,3,15,20,7], …...

数字逻辑-时序逻辑电路一

一、实验目的 &#xff08;1&#xff09;熟悉触发器的逻辑功能及特性。 &#xff08;2&#xff09;掌握集成D和JK触发器的应用。 &#xff08;3&#xff09;掌握时序逻辑电路的分析和设计方法。 二、实验仪器及材料 三、实验内容及步骤 1、用D触发器&#xff08;74LS74&am…...

web 课程

文章目录 格式图片超链接书签链接表格例子横跨束跨 格式 <br /> <br/> #换行图片 <img> 标签是用于在网页中嵌入图像的 HTML 标签&#xff0c;它有一些属性可以用来控制图像的加载、显示和交互。以下是对 <img> 标签常用属性的详细介绍&#xff1a;…...

工业园区智慧水电设备管控系统

在现代工业园区中&#xff0c;水电设备的管控系统起着至关重要的作用。这些系统不仅仅是简单的机械装置&#xff0c;它们更是一种智慧的结合&#xff0c;为工业生产提供了可靠的保障和高效的管理。让我们一起来探索工业园区智慧水电设备管控系统的奥秘。 我们来看看水电设备的…...

Git之版本回退

文章转载于&#xff1a;https://www.jianshu.com/p/3020740561a8 以前&#xff0c;如果是要去除某一块功能&#xff0c;我都是选择性删除&#xff0c;选择性注释&#xff0c;然后前后逻辑各种查看&#xff0c;各种比较。每一次&#xff0c;改完这些我总感觉心好累啊&#xff01…...

「jQuery系列」jQuery 校验表单(Validate)

文章目录 一、校验表单&#xff08;Validate&#xff09;1. 基本用法2. 验证规则3. 国际化4. 插件扩展 二、Validate常用方法1. 基本验证2. 自定义验证规则3. 远程验证&#xff08;通过 AJAX&#xff09;4. 提交处理&#xff08;submitHandler&#xff09;5. 忽略某些元素的验证…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...