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 {
    
    @Bean
    public 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 {
    
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10); // 设置线程池大小为10
        return 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 {
    @Resource
    private 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 ;
    }

最终效果 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++教程从0到1入门编程】第九篇:STL中Vector类

一、vector的介绍 1.vector的介绍 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&…

如何处理爬虫代理的404错误

目录 前言 一、什么是404错误 二、处理404错误的方法 1. 重新尝试请求 2. 使用备用代理 3. 日志记录 总结 前言 在进行网络爬虫开发过程中&#xff0c;经常会遇到一些特殊的错误&#xff0c;例如404错误。当我们使用代理服务器进行网络爬取时&#xff0c;有时候会遇到4…

vMware WorkStation创建虚拟机安装CentOS7,NAT模式配置网络

一、安装虚拟机 1、选择典型&#xff08;推荐&#xff09;配置 2、选择稍后安装操作系统 3、操作系统选择CentOS7 64位 4、虚拟机命名、选择安装位置 6、指定磁盘容量 7、指定磁盘容量 步骤&#xff1a; &#xff08;1&#xff09;、系统内存2GB &#xff08;2&#xff09;、…

vue项目:webpack打包优化实践

本文目录 一、项目基本信息二、分析当前项目情况1、使用 webpack-bundle-analyzer 插件2、使用 speed-measure-webpack-plugin 插件 三、解决构建问题1、caniuse-lite 提示的问题2、 warning 问题 四、打包速度优化1、修改source map2、处理 loader 五、webpack性能优化1、使用…

P4551 最长异或路径

最长异或路径 题目描述 给定一棵 n n n 个点的带权树&#xff0c;结点下标从 1 1 1 开始到 n n n。寻找树中找两个结点&#xff0c;求最长的异或路径。 异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 输入格式 第一行一个整数 n n n&#xff0c;表示点数…

Threejs粒子水波纹效果

依赖 three&#xff08;这个重要&#xff09;react &#xff08;这个不重要&#xff09;ahooks&#xff08;这个不重要&#xff09;unocss&#xff08;这个不重要&#xff09; 效果 代码 import React, { useEffect, useRef } from react; import { useGetState } from ahoo…

视频AI方案:数据+算力+算法,人工智能的三大基石

背景分析 随着信息技术的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的各个领域&#xff0c;从智能家居到自动驾驶&#xff0c;从医疗诊断到金融风控&#xff0c;AI的应用正在改变着我们的生活方式。而数据、算法和算力&#xff0c;正是构…

基于SpringBoot+MYSQL的社区团购系统

目录 1、前言介绍 2、主要技术 3、系统流程分析 3.1、注册流程 3.2、登录流程 3.3、购买流程 4、系统设计 4.1、系统结构设计 4.2、系统顺序图 4.2.1、登录模块顺序图 4.2.2、添加信息模块顺序图 4.3、数据库设计 4.3.1、数据库E-R图设计 4.3.2、数据库表设计 5、…

找不到mfc140u.dll怎么办?修复缺失mfc140u.dll的多种方案分享

mfc140u.dll文件是一个重要的动态链接库文件&#xff0c;它在Windows操作系统中发挥着关键的作用。由于各种原因&#xff0c;例如应用程序冲突或系统错误等&#xff0c;mfc140u.dll文件有时会出现丢失的情况。一旦发生这种问题&#xff0c;运行依赖此文件的应用程序将无法正常启…

(2)(2.12) Robsense SwarmLink

文章目录 前言 1 规格&#xff08;根据制造商提供&#xff09; 2 EasySwarm 3 参数说明 前言 Robsense SwarmLink 遥测无线电可将多架无人机连接到一个地面站&#xff0c;而无需在地面站一侧安装多个无线电&#xff08;即创建一个网状网络&#xff09;。此外&#xff0c;还…

解决vue2+elementUI的下拉框出现自动校验的问题

问题&#xff1a; 总结原因是因为新增的时候&#xff0c;传了空值进去 可以这样子解决 this.formData.value && this.$set(this.model, this.formData.key, this.formData.value)这种是只有值存在的时候才会给他赋值&#xff0c;但是这只解决单选下拉框&#xff0c;…

精读《正交的 React 组件》

1 引言 搭配了合适的设计模式的代码&#xff0c;才可拥有良好的可维护性&#xff0c;The Benefits of Orthogonal React Components 这篇文章就重点介绍了正交性原理。 所谓正交&#xff0c;即模块之间不会相互影响。想象一个音响的音量与换台按钮间如果不是正交关系&#xf…

10、Redis分布式系统之数据分区算法

Redis分布式系统之数据分区算法 1、什么是Redis分布式系统 ​ Redis分布式系统&#xff0c;官方称为Redis Cluster, Redis集群&#xff08;这个集群和前面的主从复制集群不同&#xff0c;这个集群可以理解为是多个主从复制集群所组成的集群&#xff09;&#xff0c;其实是Red…

保研复习数据结构记(4)--树(二叉树、线索树、哈夫曼树,并查集)

一.树的基本术语 1.树 什么是空树&#xff1f;结点数为0的树非空树的特性&#xff1f;有且仅有一个根结点&#xff0c;没有后继的结点称为“叶子结点”&#xff0c;有后继的结点称为“分支结点”&#xff0c;除了根结点外任何一个结点都有且仅有一个前驱&#xff0c;每个结点…

VS 调试Hololens 2工程报错 有未经处理的异常: Microsoft C++ 异常:

原因是unity 少安装了XR工具包 安装完后重新用unity打包&#xff0c;然后vs打开打包出来的工程&#xff0c;电脑和眼镜用usb连接&#xff0c;直接运行调试就可以了

力扣L6--- 两数之和(java版)--2024年3月12日

1.题目 2.知识点 注1&#xff1a;在Java中&#xff0c;数组的长度不是通过调用一个方法获得的&#xff0c;而是通过一个属性直接获得的。因此&#xff0c;正确的语法是nums.length而不是nums.length()。 所以应该使用int m nums.length; 注2&#xff1a;return new int[]{i,…

3DMAX的选择模型高亮显示方式

1、选择时会显示有个外框&#xff0c;J或ShiftJ。 2 首选项设置里有高亮设置 3 就像F4一样&#xff0c;选择时边面显示

Spring Boot Admin服务监控

目录 概述实践server端pom.xml类配置结果clientpom.xml配置 结束 概述 Spring Boot Admin 集权限、日志、异常通知。 实践 server端 pom.xml <!-- SpringBoot Admin --> <dependency><groupId>de.codecentric</groupId><artifactId>spring-…

【算法面试题】-07

小明找位置 题目描述 小朋友出操&#xff0c;按学号从小到大排成一列;小明来迟了&#xff0c;请你给小明出个主意&#xff0c;让他尽快找到他应该排的位置。 算法复杂度要求不高于nLog(n);学号为整数类型&#xff0c;队列规模<10000; 输入描述 1、第一行:输入已排成队列的…

STM32外设分类--学习笔记

简介: 本文在于根据自己的理解&#xff0c;将stm32f103外设按照功能分个类别&#xff0c;便于记忆。下面的几张图一定要熟悉&#xff0c;后期编写代码时能够快速找到想要的功能和对应的引脚。 我使用的工具链是&#xff1a;使用CubeMX完成keil5工程搭建和引脚初始化功能,然后用…