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

进阶SpringBoot之异步任务、邮件任务和定时执行任务

SpringBooot 创建 Web 项目

异步任务:

service 包下创建 AsyncService 类

@Async 异步方法

Thread.sleep(3000)  停止三秒,捕获异常

package com.demo.task.service;import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;//异步
@Service
public class AsyncService {//异步方法@Asyncpublic void hello(){try {Thread.sleep(3000);} catch (InterruptedException e) {//throw new RuntimeException(e);e.printStackTrace();}System.out.println("数据正在处理");}
}

controller 包下创建 AsyncController 类

自动装配 AsyncService

方法里调用 AsyncService 类里的 hello 方法,停止三秒

package com.demo.task.controller;import com.demo.task.service.AsyncService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class AsyncController {@AutowiredAsyncService asyncService;@RequestMapping("/hello")public String hello(){asyncService.hello();return "OK";}
}

主程序添加 @EnableAsync 开启异步注解功能

package com.demo.task;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@EnableAsync //开启异步注解功能
@SpringBootApplication
public class TaskApplication {public static void main(String[] args) {SpringApplication.run(TaskApplication.class, args);}
}

启动即可,记得地址加后缀

(加了注解后,实际上响应很快,页面很快出现,但程序执行过了三秒,就是输出的那句“数据正在处理”过了三秒出现)

邮件任务:

pom.xml 导入 spring-boot-starter-mail 的 jar 包

        <!-- 导入javax.mail --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>

拿 qq 邮箱举例,点击设置 -> 账号,下滑找到 POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务

点击管理服务,获取到授权码

application.properties 配置邮箱信息:

#邮箱账号
spring.mail.username=xx@qq.com
#邮箱密码:授权码
spring.mail.password=xx
spring.mail.host=smtp.qq.com
#开启加密验证
spring.mail.properties.mail.smtp.ssl.enable=true

测试类:

自动装配 JavaMailSenderImpl

new 一个 SimpleMailMessage,调用邮件相关信息

最后发送即可

package com.demo.task;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;@SpringBootTest
class TaskApplicationTests {@AutowiredJavaMailSenderImpl mailSender;@Testvoid contextLoads() {SimpleMailMessage message = new SimpleMailMessage();message.setSubject("邮件主题");message.setText("文本内容");message.setTo("xx@qq.com");message.setFrom("xx@qq.com");mailSender.send(message);}}

上述只是简单的邮件,复杂邮件如下:

createMimeMessage -> new MimeMessageHelper -> ... -> send

package com.demo.task;import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;import java.io.File;@SpringBootTest
class TaskApplicationTests {@AutowiredJavaMailSenderImpl mailSender;@Testvoid contextLoads2() throws MessagingException {MimeMessage mimeMessage = mailSender.createMimeMessage();//组装MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"utf-8");helper.setSubject("邮件主题");helper.setText("<p style='color:red'>文本内容</p>",true);//附件helper.addAttachment("1.jpg",new File("E:\\1.jpg"));helper.setTo("xx@qq.com");helper.setFrom("xx@qq.com");mailSender.send(mimeMessage);}}

定时任务:

主程序类上添加一行 @EnableScheduling 开启定时功能

package com.demo.task;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;@EnableAsync //开启异步注解功能
@EnableScheduling //开启定时功能的注解
@SpringBootApplication
public class TaskApplication {public static void main(String[] args) {SpringApplication.run(TaskApplication.class, args);}
}

service 包下创建 ScheduledService 类:

方法上添加 @Scheduled 注解

package com.demo.task.service;import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;@Service
public class ScheduledService {//定时:在一个特定的时间执行程序//core表达式:      秒 分 时 日 月 周几//                0/2 14 13 ? * 1-5   每个月周一到周五13点14分,每隔两秒执行一次@Scheduled(cron = "0 20 5 * * ?")  //每天5点20分0秒执行方法public void hello(){System.out.println("hello");}
}

查看 Scheduled 源码,提供了多种配置调度任务的方式

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
@Reflective
public @interface Scheduled {String CRON_DISABLED = "-";String cron() default "";String zone() default "";long fixedDelay() default -1L;String fixedDelayString() default "";long fixedRate() default -1L;String fixedRateString() default "";long initialDelay() default -1L;String initialDelayString() default "";TimeUnit timeUnit() default TimeUnit.MILLISECONDS;String scheduler() default "";
}

Cron 在线表达式生成器

可以实现在线生成表达式

相关文章:

进阶SpringBoot之异步任务、邮件任务和定时执行任务

SpringBooot 创建 Web 项目 异步任务&#xff1a; service 包下创建 AsyncService 类 Async 异步方法 Thread.sleep(3000) 停止三秒&#xff0c;捕获异常 package com.demo.task.service;import org.springframework.scheduling.annotation.Async; import org.springfram…...

【设计模式-桥接】

定义 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它通过将抽象部分与实现部分分离&#xff0c;使它们都可以独立地变化。桥接模式的关键在于将类的抽象部分与其实现部分解耦&#xff0c;以便两者可以独立地变化。这种设计模式的一个主要…...

JVM JMM 专题篇 ( 12000 字详解 )

一&#xff1a;JVM 简介 JVM 是 Java Virtual Machine 的简称&#xff0c;意为 Java 虚拟机&#xff0c;虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。 常见的虚拟机&#xff1a;JVM、VMwave、Virtual Box&#xff0c;JVM 和其…...

【C++】—— list 模拟实现

【C】—— list 模拟实现 1 list 基础结构2 默认构造3 迭代器3.1 整体框架3.2 成员函数3.3 begin() 与 end() 的实现3.4 operator-> 的实现3.5 const 迭代器3.5.1 const 迭代器为什么命名 const_iterator3.5.2 const 迭代器的实现3.5.3 合并两个迭代器 4 源码 1 list 基础结…...

Redis主要问题

Redis redis是单线程&#xff0c;基于内存操作&#xff0c;所以执行很快。&#xff0c;与网络延迟有关。 还是买早餐的例子&#xff0c;从早餐店买一个包子&#xff0c;首先早餐店得还有包子没有卖完&#xff0c;然后卖出&#xff0c;包子数量-1&#xff0c;重新设定早餐店包…...

vue3 ref的用法及click事件的说明

1、ref可以定义一个简单的属性&#xff0c;也可以是一个复杂的列表、数组等等。 2、为什么要使用 ref&#xff1f;简单的let个变量不行吗&#xff1f;const个变量不行吗&#xff1f; 其实这个跟vue的响应式的系统有关&#xff0c;官方的说明如下&#xff1a; 3、为 ref() 标注…...

通信工程学习:什么是HFC混合光纤同轴电缆

HFC&#xff1a;混合光纤同轴电缆 HFC&#xff08;Hybrid Fiber Coaxial&#xff09;混合光纤同轴电缆是一种结合了光纤与同轴电缆的宽带接入网技术。以下是对HFC混合光纤同轴电缆的详细解释&#xff1a; 一、HFC混合光纤同轴电缆的定义与概述 定义&#xff1a;HFC是一种结合光…...

怎么浏览URL的PDF文件呢

最近发现PDF文件网页端打开就是丑&#xff0c;不知道怎么办 1. 看着实在不舒服&#xff0c;用chorm的插件 然后原本本地用的也是2345pdf阅读器 2. 之后也下载了adobe pdf的桌面阅读器 2345打开是这个样子 这个是现在啦 如果要一些安装包什么的&#xff0c;评论见~ 最…...

【2025届华为秋招机考三道编程题之一】华为校招留学生软件开发工程师-真题机考笔试/(200分)- 跳格子3(Java JS Python C)

华为校招机考的题型&#xff1a; 编程&#xff1a;软件测试工程师&#xff0c;算法&#xff0c;OD岗&#xff0c;三道编程题不限语言【C&#xff0c;Python&#xff0c;Java】 校招&#xff1a;600分 120分钟&#xff0c;100/200/300 社招&#xff1a;400分 150分钟&#xf…...

高性能缓存利器:Caffeine 在 Spring Boot 中的应用

在现代应用程序中&#xff0c;缓存是提高数据检索速度、减少对数据库或其他数据源访问次数的重要手段。Spring Cache 提供了多种缓存实现方式&#xff0c;而在我们的 Spring Boot 项目中&#xff0c;我们选择了 Caffeine 作为默认的缓存库。 Caffeine 简介 Caffeine 是一个基…...

pWnOS的第二种全新解法(ssh私钥破解、webmin漏洞提权)

端口 端口扫描内容请看&#xff1a;vulnhub&#xff08;8&#xff09;&#xff1a;pWnOS&#xff08;还没信息收集就已经成功打点&#xff09;-CSDN博客 打点 ssh登录公钥收集 ./2017.pl 192.168.234.116 10000 /home/vmware/.ssh/authorized_keys 0 ./2017.pl 192.168.234.11…...

Maven入门学习笔记

一、maven介绍 Maven是一款自动化构建工具&#xff0c;专注服务于JAVA平台的项目构建和依赖管理。在javaEE开发的历史上构建工具的发展也经历了一系列的演化和变迁。 管理jar包 当我们使用SSM之后我们就需要使用非常多的jar包 没有maven找jar包非常的麻烦。 使用maven下载…...

linux驱动开发-arm汇编基础

目录 写在前面 1、Cortex-A7 处理器有 9 种处理模式 2、Cortex-A 寄存器组 通用寄存器 1、汇编语法 2、Cortex-A7 常用汇编指令 2.1 处理器内部数据传输指令 2.1.1 传输数据操作类型 1、MOV指令 2、MRS指令 3、MSR指令 2.2、存储器访问指令 2.2.1 LDR指令 2.2.2 …...

【HarmonyOS】鸿蒙头像上传-(编辑个人信息页- 头像上传)+实时数据更新

#效果图 #思路 ##步骤&#xff1a; ###一、利用picker api选择1张图片 实例化选择器参数(使用new PhotoSelectOptions())实例化图片选择器 (使用newPhotoViewPicker() )调用图片选择器的select方法传入选择器参数完成图片选取获得结果 利用picker api选择1张图片 async sele…...

[数据集][目标检测]无人机识别检测数据集VOC+YOLO格式6986张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6986 标注数量(xml文件个数)&#xff1a;6986 标注数量(txt文件个数)&#xff1a;6986 标注…...

基于SSM的二手交易管理系统的设计与实现 (含源码+sql+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的二手交易管理系统1拥有两种角色 管理员&#xff1a;商品管理、订单管理、充值管理、用户管理等用户&#xff1a;发布商品、查看闲置、充值账户、查看所有订单、发布求购信息、修…...

linux-centos 设置系统时间

CentOS 系统提供了多种方式来设置和管理时间&#xff0c;包括手动设置时间和使用网络时间协议 (NTP) 自动同步时间。以下是几种常见的方法&#xff1a; 手动设置时间 使用date命令临时设置时间&#xff1a; 如果你只需要临时设置时间&#xff0c;可以使用 date 命令&#xff1…...

【Linux基础】冯诺依曼体系结构操作系统的理解

目录 前言一&#xff0c;冯诺依曼体系1. 为什么有内存结构?2. 对硬件中数据流动的再理解 二&#xff0c;操作系统(Operator System)1. 概念2. 操作系统结构的层状划分3. 操作系统对硬件管理的理解4. 用户与操作系统的关系的理解5. 系统调用和库函数的关系6. 为什么要有操作系统…...

算法题解:斐波那契数列(C语言)

斐波那契数列 斐波那契数列是一个经典的数学序列&#xff0c;其中每一项的值是前两项的和。数列的前两项通常定义为0和1&#xff0c;即&#xff1a; F(0) 0 F(1) 1 F(n) F(n-1) F(n-2) (n ≥ 2)输入一个正整数n&#xff0c;求斐波那契数列的第n项。 样例 假设输入 n …...

SSM 框架 个人使用习惯 详细

SpringMVC主要是controller、service、dao&#xff08;mapper&#xff09;层交互 controller&#xff1a;处理数据请求的接口 service&#xff1a;处理请求的数据 dao&#xff08;mapper&#xff09;&#xff1a;对数据进行持久化 下面我将对controller和service.impl进行讲…...

英飞凌TC3XX时钟系统实战:从PLL配置到CCU分频的避坑指南

英飞凌TC3XX时钟系统实战&#xff1a;从PLL配置到CCU分频的避坑指南 在嵌入式系统开发中&#xff0c;时钟系统如同人体的神经系统&#xff0c;为整个芯片提供精准的时序控制和同步信号。作为英飞凌AURIX™系列中的旗舰产品&#xff0c;TC3XX微控制器凭借其高度可配置的时钟架构…...

保姆级教程:用Arduino IDE给你的ESP8266写个‘网络诊断’程序,一键排查连接问题

ESP8266网络诊断工具开发实战&#xff1a;从被动排错到主动分析 当你盯着串口监视器里不断滚动的"Connecting..."字样&#xff0c;而ESP8266始终无法连上WiFi时&#xff0c;是否想过——我们本可以做得比盲目重试更聪明&#xff1f;本文将带你开发一个会"思考&q…...

AMD Ryzen处理器深度调试指南:解锁硬件性能的终极利器

AMD Ryzen处理器深度调试指南&#xff1a;解锁硬件性能的终极利器 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…...

全球AI薪资热力图:旧金山VS深圳的残酷对比

一场不平等的技术竞赛当我们谈论人工智能&#xff08;AI&#xff09;的未来时&#xff0c;旧金山湾区与深圳无疑是最为闪耀的两个坐标。前者是硅谷的心脏&#xff0c;全球科技创新的策源地&#xff1b;后者是中国乃至世界硬件制造与新兴科技应用的前沿阵地。然而&#xff0c;对…...

低显存福音:实测Neeshck轻量化工具,16G显卡流畅跑Z-Image模型

低显存福音&#xff1a;实测Neeshck轻量化工具&#xff0c;16G显卡流畅跑Z-Image模型 1. 轻量化方案的诞生背景 1.1 大模型与小显存的矛盾 Z-Image作为国产文生图模型的代表&#xff0c;其强大的生成能力有目共睹。但原生部署对显存的高要求&#xff08;通常需要20GB以上&am…...

告别while循环轮询!用STM32 HAL库定时器中断实现按键扫描(附状态机源码)

STM32高效按键处理实战&#xff1a;定时器中断与状态机的完美结合 在嵌入式开发中&#xff0c;按键处理看似简单却暗藏玄机。传统while循环轮询方式不仅占用CPU资源&#xff0c;还容易导致代码结构混乱。本文将带你用STM32 HAL库的定时器中断和状态机&#xff0c;实现一套高效、…...

2025届毕业生推荐的AI论文方案推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 身为前沿那种 AI 工具的 DeepSeek&#xff0c;能够明显提高学术论文写作的效率。于文献综述这…...

2026-04随笔记

2026-04-01因为前天工作卡住了&#xff0c;导致昨天没心情研究&#xff0c;一度以为我不适合这个工作&#xff0c;早上的时候回想了一下成功和失败的场景认真做对比细心分析发现一个 LoadBalance的ip没设置&#xff0c;虽然自动获取了&#xff0c;但是helm的其他地方也用了这个…...

在Windows上直接安装Android应用:APK-Installer完整使用指南

在Windows上直接安装Android应用&#xff1a;APK-Installer完整使用指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经想在Windows电脑上运行Android应用&…...

校园网环境下树莓派与Windows直连SSH的实战指南

1. 为什么需要网线直连树莓派&#xff1f; 在校园网环境下使用树莓派时&#xff0c;很多同学都会遇到这样的困扰&#xff1a;宿舍里没有路由器&#xff0c;校园WiFi又需要复杂的认证&#xff0c;根本无法让树莓派联网。这时候&#xff0c;一根普通的网线就能解决大问题。 我第一…...