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

Spring Boot Async:从入门到精通,原理详解与最佳实践

Spring Boot 的异步功能(Async)允许我们将某些任务异步执行,而不会阻塞主线程。这对于处理耗时的操作非常有用,如发送电子邮件、生成报表、调用外部 API 等。通过异步处理,我们可以释放主线程,让它继续处理其他请求,同时后台任务在后台线程中进行。这种方式可以显著提高应用程序的响应速度和并发性。

Spring Boot Async 使用场景

以下是一些适合使用 Spring Boot 异步功能的常见场景:1.发送电子邮件: 当需要发送大量电子邮件或电子邮件发送需要较长时间时,异步处理可以确保用户不必等待邮件发送完成而导致延迟响应。2.数据处理: 在数据处理任务中,如文件上传后的数据导入、图像处理或数据转换,异步可以提高系统的吞吐量。3.外部 API 调用: 如果应用程序需要与外部服务进行通信,异步调用可以避免长时间等待外部服务的响应。4.定时任务: 使用定时任务执行一些后台处理工作时,异步能够确保任务不会影响到主线程的正常运行。

Spring Boot Async 配置

要在 Spring Boot 项目中使用异步功能,你需要执行以下步骤:

1. 添加依赖

首先,你需要在项目的 Maven 或 Gradle 构建文件中添加 Spring Boot 异步支持的依赖:Maven:

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

Gradle:

 
implementation 'org.springframework.boot:spring-boot-starter'

2. 启用异步

在 Spring Boot 应用程序的主类上添加 @EnableAsync 注解以启用异步功能:

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

3. 创建异步方法

现在,你可以在服务类或任何需要异步执行的方法上使用 @Async 注解:

 
@Service
public class MyService {@Asyncpublic CompletableFuture<String> doSomethingAsync() {// 异步执行的任务// 返回一个 CompletableFuture 以便获取异步任务的结果}
}

Spring Boot Async 实践案例

当涉及到 Spring Boot 中的异步编程时,一个常见的实践案例是使用异步方法来处理后台任务,以提高应用程序的性能和响应速度。以下是一个详细的实践案例,展示如何创建一个 Spring Boot 应用程序,使用异步方法来执行后台任务。

步骤 1:创建 Spring Boot 项目

首先,你需要创建一个新的 Spring Boot 项目。你可以使用 Spring Initializr(https://start.spring.io/)或在 IDE 中使用 Spring Boot 插件来快速创建项目。确保在项目配置中添加Spring WebSpring Aspects依赖。关于具体的创建,你可以访问这篇文章:【如何在线建一个 JAVA 的 Spring Boot 项目?Spring Boot 快速入门 Helloworld 示例】

步骤 2:添加异步支持

在项目的主类上添加@EnableAsync注解以启用 Spring Boot 的异步功能:

 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication
@EnableAsync
public class AsyncExampleApplication {public static void main(String[] args) {SpringApplication.run(AsyncExampleApplication.class, args);}
}

步骤 3:创建异步服务

创建一个服务类,其中包含一个异步方法。在这个示例中,我们将模拟一个发送电子邮件的异步任务:

 
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;@Service
public class EmailService {@Asyncpublic void sendEmail(String recipient, String message) {// 模拟电子邮件发送过程,这里可以包括连接到邮件服务器、发送邮件等操作System.out.println("Sending email to " + recipient + ": " + message);try {Thread.sleep(5000); // 模拟邮件发送需要的时间} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Email sent successfully to " + recipient);}
}

步骤 4:创建控制器

创建一个 REST 控制器,用于触发异步电子邮件发送:

 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class EmailController {@Autowiredprivate EmailService emailService;@GetMapping("/sendEmail")public String sendEmail(@RequestParam(required = false, defaultValue = "") String recipient, @RequestParam(required = false, defaultValue = "") String message) {emailService.sendEmail(recipient, message);return "Email sending request received.";}
}

步骤 5:运行应用程序

现在,你可以运行 Spring Boot 应用程序。应用程序将启动,并且可以通过访问http://localhost:8080/sendEmail或者http://localhost:8080/sendEmail?recipient=your-email@example.com&message=Hello来触发电子邮件发送请求。

步骤 6:观察异步行为

当你发送电子邮件请求时,应用程序将立即返回响应,而不会等待电子邮件发送完成。后台线程将负责实际的电子邮件发送过程。

实践案例注意事项

  • 确保适当地配置线程池以控制异步方法的并发性。
  • 异步方法中的异常处理非常重要。确保适当地处理异常以防止应用程序崩溃。
  • 这个示例中的电子邮件发送是模拟的。在实际应用中,你需要连接到邮件服务器并执行实际的电子邮件发送操作。通过这个实践案例,你可以了解如何在 Spring Boot 中使用异步方法来处理后台任务,从而提高应用程序的性能和响应速度。异步编程是处理并发性和性能问题的强大工具,可以用于各种不同的应用场景。

使用 Apifox 测试和管理接口

如果你是 JAVA 开发者,你经常需要与 API 打交道,确保你的应用程序能够正常工作。这时,一个强大的接口测试工具就会派上用场。

Apifox 是一个比 Postman 更强大的接口测试工具,Apifox = Postman + Swagger + Mock + JMeter,Apifox 支持调试 http(s)、WebSocket、Socket、gRPCDubbo 等协议的接口,并且集成了 IDEA 插件。在开发完接口后,可以通过 Apifox 的 IDEA 插件一键自动生成接口文档,多端同步,非常方便测试和维护。

Spring Boot Async 注意事项

在使用 Spring Boot 异步功能时,要注意以下几点:

  • 线程池配置: 默认情况下,Spring Boot 使用一个简单的线程池来处理异步方法。你可以通过配置文件或属性来自定义线程池的大小和其他属性,以满足你的需求。
  • 异常处理: 异步方法中的异常处理需要特别小心。要确保你的异常能够被捕获并适当地处理,以避免应用程序崩溃。
  • 性能监控: 异步任务的性能监控可能需要额外的配置,以便你可以跟踪任务的执行情况和性能指标。

知识扩展:

  • Spring Boot Actuator Endpoints 如何使用?Spring Boot 运行状况端点的用法
  • Spring Boot 配置文件 application.properties 的概念及用法,详解 application.properties 配置文件

参考链接: 如果你希望深入学习和探索 Spring Boot 异步功能,以下是一些官方文档链接:

  • Spring Boot 异步处理:Redirecting...
  • Spring Boot @EnableAsync 注解:Redirecting...

相关文章:

Spring Boot Async:从入门到精通,原理详解与最佳实践

Spring Boot 的异步功能&#xff08;Async&#xff09;允许我们将某些任务异步执行&#xff0c;而不会阻塞主线程。这对于处理耗时的操作非常有用&#xff0c;如发送电子邮件、生成报表、调用外部 API 等。通过异步处理&#xff0c;我们可以释放主线程&#xff0c;让它继续处理…...

oracle 19c创建db_link名称带.com域名问题处理

文章目录 一、修改PDB的global_name二、重启数据库实例三、修改domain后重试 一、修改PDB的global_name SYSorcl1>sho pdbsCON_ID CON_NAME OPEN MODE RESTRICTED ---------- ------------------------------ ---------- ----------2 PDB$SEED …...

银行卡二要素API的应用案例:从在线购物到金融投资

引言 随着互联网技术的不断发展&#xff0c;人们的金融需求也在不断增加。随之而来的是各种新型金融服务的涌现&#xff0c;让用户的金融体验更加便利快捷。其中&#xff0c;银行卡二要素API的应用&#xff0c;则为用户的金融体验和安全性提供了极大的保障。 银行卡二要素API…...

MySQL 忘记root密码后重置密码操作

在忘记 MySQL 密码的情况下&#xff0c;可以通过 --skip-grant-tables 关闭服务器的认证&#xff0c;然后重置 root 的密码&#xff0c;具体操作步骤如下。 步骤 1)&#xff1a;关闭正在运行的 MySQL 服务。打开 cmd 进入 MySQL 的 bin 目录。 步骤 2)&#xff1a;输入mysqld -…...

开源电子合同签署平台小程序源码/电子文件签字+在线合同签署系统源码/电子合同小程序源码

源码简介&#xff1a; 开源电子合同签署平台小程序源码&#xff0c;它是电子文件签字在线合同签署系统源码/电子合同小程序源码 目前商业端和开源端一致&#xff0c;免费开源状态&#xff01; 聚合市场上各类电子合同解决方案商&#xff0c;你无需一个一个的对接电子合同厂商…...

J.408之数据结构

J-408之数据结构_北京信息科技大学第十五届程序设计竞赛&#xff08;同步赛&#xff09; (nowcoder.com) 思维好题&#xff0c;直接用两个set存没出现的数字就好了 // Problem: 408之数据结构 // Contest: NowCoder // URL: https://ac.nowcoder.com/acm/contest/68572/J // Me…...

前端食堂技术周刊第 107 期:技术播客节、Deno Cron、FEDAY、XState v5、Electron 2023 生态系统回顾

美味值&#xff1a;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f; 口味&#xff1a;烤椰拿铁 食堂技术周刊仓库地址&#xff1a;https://github.com/Geekhyt/weekly 大家好&#xff0c;我是童欧巴。欢迎来到前端食堂技术周刊&#xff0c;我们先来看下…...

三防平板|手持终端PDA|8寸/10寸工业三防平板电脑主板方案定制

近年来&#xff0c;随着科技的快速发展&#xff0c;三防平板成为了各行各业中不可或缺的工具。三防平板采用IP67级别的防护设计&#xff0c;通过了多项测试标准&#xff0c;如国标和美标&#xff0c;具备防水、防摔、防尘、防撞、防震、防跌落以及防盐雾等多重防护功能。因此&a…...

【C语言】动态内存管理(C语言的难点与精华,数据结构的前置知识,你真的掌握了吗?)

文章目录 引言一、为什么要动态内存分配二、动态内存分配的相关函数2.1 malloc2.2 free2.3 calloc2.4 realloc 三、常见的动态内存的错误3.1 对NULL指针的解引用3.2 对动态内存越界访问3.3 对非动态内存释放3.4 对动态内存部分释放3.5 对动态内存多次释放3.6 未对动态内存释放&…...

最长子序列问题(LCS)--动态规划解法

题目描述&#xff1a; 如果Z既是X的子序列&#xff0c;又是Y的子序列&#xff0c;则称Z为X和Y的公共子序列。 如果给定X、Y&#xff0c;求出Y及其长度。 示例&#xff1a; 输入 ABCPDSFJGODIHJOFDIUSHGD OSDIHGKODGHBLKSJBHKAGHI 输出 SDIHODSHG 9 分析&#xff1a; c…...

实时流式计算 kafkaStream

文章目录 实时流式计算Kafka StreamKafka Streams 的关键概念KStreamKafka Stream入门案例编写SpringBoot 集成 Kafka Stream 实时流式计算 一般流式计算会与批量计算相比较 流式计算就相当于上图的右侧扶梯&#xff0c;是可以源源不断的产生数据&#xff0c;源源不断的接收数…...

西南科技大学模拟电子技术实验七(集成运算放大器的非线性应用)预习报告

一、计算/设计过程 说明:本实验是验证性实验,计算预测验证结果。是设计性实验一定要从系统指标计算出元件参数过程,越详细越好。用公式输入法完成相关公式内容,不得贴手写图片。(注意:从抽象公式直接得出结果,不得分,页数可根据内容调整) 预习计算内容根据运放的非线…...

Ubuntu与Windows通讯传输文件(FTP服务器版)(没用的方法,无法施行)

本文介绍再Windows主机上建立FTP服务器&#xff0c;并且在Ubuntu虚拟机上面访问Windows上FTP服务器的方法 只要按照上图配置就可以了 第二部&#xff1a;打开IIS管理控制台 右击网站&#xff0c;新建FTP站点。需要注意的一点是在填写IP地址的时候&#xff0c;只需要填写Window…...

2024年AI视频识别技术的6大发展趋势预测

随着人工智能技术的快速发展&#xff0c;AI视频识别技术也将会得到进一步的发展和应用。2023年已经进入尾声&#xff0c;2024年即将来临&#xff0c;那么AI视频识别技术又将迎来怎样的发展趋势&#xff1f;本文将对2023年的AI视频技术做一个简单的盘点并对2024年的发展趋势进行…...

一篇文章了解JDK的前世今生

我们每天都在开发Java,每天都在使用JDK,那么我们了解JDK的发展史吗,这篇文章将带你深入了解JDK的发展史。 JDK(Java Development Kit)是Java开发者工具包,是用于编写Java程序和运行Java程序的软件开发工具集。自从1995年Java语言首次发布以来,JDK已经经历了数十年的发展…...

Redisson出现问题总结

org.redisson.client.RedisAuthRequiredException: NOAUTH Authentication required… channel: 出现此问题的原因为没有redis权限。解决方案在setAddress()后面加上setPassword()方法。 config.useSingleServer().setAddress("redis://localhost:6379").setPasswo…...

领域驱动架构(DDD)建模

一、背景 常见的软件开发方式是拿到产品需求后&#xff0c;直接考虑数据库中表应该如何设计&#xff0c;这种方式已经将设计与业务需求脱节&#xff0c;而更多的是直接考虑应该如何实现了&#xff0c;这有点本末倒置。而DDD是从领域(问题域)为出发点进行的设计方法。 领域驱动…...

PostgreSQL从小白到高手教程 - 第38讲:数据库备份

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第38讲&#…...

OpenGL ES eglCreatePbufferSurface() 和 eglCreateWindowSurface() 的对比和使用

一、介绍 相同点&#xff1a; eglCreatePbufferSurface 和 eglCreateWindowSurface 都是 OpenGL ES 中用于创建不同类型的EGL表面的函数&#xff0c;以便在OpenGL ES中进行渲染。 不同点&#xff1a; 选择使用哪种表面类型取决于你的需求。如果你只是需要在内存中进行离屏渲…...

python之马尔科夫链(Markov Chain)

马尔可夫链&#xff08;Markov Chain&#xff09;是一种随机过程&#xff0c;具有“马尔可夫性质”&#xff0c;即在给定当前状态的条件下&#xff0c;未来状态的概率分布仅依赖于当前状态&#xff0c;而与过去状态无关。马尔可夫链在很多领域都有广泛的应用&#xff0c;包括蒙…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

21-Oracle 23 ai-Automatic SQL Plan Management(SPM)

小伙伴们&#xff0c;有没有迁移数据库完毕后或是突然某一天在同一个实例上同样的SQL&#xff0c; 性能不一样了、业务反馈卡顿、业务超时等各种匪夷所思的现状。 于是SPM定位开始&#xff0c;OCM考试中SPM必考。 其他的AWR、ASH、SQLHC、SQLT、SQL profile等换作下一个话题…...