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

Spring Boot中@Async注解的使用及原理 + 常见问题及解决方案

在这里插入图片描述

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~
🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志
🎐 个人CSND主页——Micro麦可乐的博客
🐥《Docker实操教程》专栏以最新的Centos版本为基础进行Docker实操教程,入门到实战
🌺《RabbitMQ》专栏主要介绍使用JAVA开发RabbitMQ的系列教程,从基础知识到项目实战
🌸《设计模式》专栏以实际的生活场景为案例进行讲解,让大家对设计模式有一个更清晰的理解
💕《Jenkins实战》专栏主要介绍Jenkins+Docker的实战教程,让你快速掌握项目CI/CD,是2024年最新的实战教程
🌞《Spring Boot》专栏主要介绍我们日常工作项目中经常应用到的功能以及技巧,代码样例完整
如果文章能够给大家带来一定的帮助!欢迎关注、评论互动~

Spring Boot中@Async注解的使用以及注意事项

  • 1、前言
  • 2、@Async注解的基本使用
    • ❶ 引入依赖
    • ❷ 启用异步支持
    • ❸ 定义异步方法
    • ❹ 调用异步方法
  • 3、@Async注解的实现原理
    • ❶ TaskExecutor
    • ❷ AOP代理
    • ❸ 异步方法返回值
  • 4、应用场景
    • ❶ 后台任务处理
    • ❷ 并行处理
    • ❸ 提高系统吞吐量
  • 5、常见问题及解决方案
    • 5.1、@Async方法调用无效
    • 5.2、异常处理
  • 6、结语

1、前言

在现代Java应用程序中,异步处理是提高性能和响应速度的重要手段之一,比如博主之前分享的【Spring Boot 使用自定义注解和自定义线程池实现异步日志记录】,就是采用了异步处理来实现日志记录,而在Spring Boot中它提供了@Async注解来简化异步编程,今天博主就来和小伙伴们分享本@Async注解的基本使用、实现原理以及应用场景。


2、@Async注解的基本使用

@Async注解用于标注方法,使其在独立的线程中异步执行。Spring Boot提供了一种简单的方法来启用异步方法调用,只需在配置类或主类上添加@EnableAsync注解

❶ 引入依赖

Spring Boot 项目 pom.xml 文件中添加必要的依赖:

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

❷ 启用异步支持

在Spring Boot应用的配置类或主类上启用异步支持 @EnableAsync

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

❸ 定义异步方法

使用@Async注解定义异步方法。例如:创建一个服务类AsyncService

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;@Service
public class AsyncService {@Asyncpublic void asyncMethod() {try {Thread.sleep(5000); // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}System.out.println("异步方法执行完成");}
}

❹ 调用异步方法

在需要调用异步方法的地方,通过注入AsyncService并调用其异步方法

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/api")
public class AsyncController {@Autowiredprivate AsyncService asyncService;@GetMapping("/async")public String callAsyncMethod() {asyncService.asyncMethod();return "异步方法已调用";}
}

最后请求访问Controller/api/async , 会发现Controller立即返回响应,而asyncMethod将在独立线程中执行,5秒后控制台输出:异步方法执行完成


3、@Async注解的实现原理

@Async注解的实现依赖于Spring的AOP(面向切面编程)和TaskExecutor

❶ TaskExecutor

Spring 使用TaskExecutor来处理异步任务。默认情况下,Spring Boot使用SimpleAsyncTaskExecutor,但我们也可以自定义TaskExecutor来控制线程池

自定义TaskExecutor
我们可以通过@Bean注解定义自定义的TaskExecutor

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;@Configuration
public class AsyncConfig {@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(25);executor.setThreadNamePrefix("AsyncThread-");executor.initialize();return executor;}
}

❷ AOP代理

@Async注解通过Spring AOP代理来实现异步调用。当标注为@Async的方法被调用时,Spring AOP会拦截调用并在TaskExecutor的线程池中异步执行该方法

❸ 异步方法返回值

@Async注解的方法可以返回voidFutureCompletableFuture等类型,如下代码

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;@Service
public class AsyncService {@Asyncpublic CompletableFuture<String> asyncMethodWithReturn() {try {Thread.sleep(5000); // 模拟耗时操作} catch (InterruptedException e) {e.printStackTrace();}return CompletableFuture.completedFuture("异步方法返回结果");}
}

调用带返回值的异步方法:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.CompletableFuture;@RestController
public class AsyncController {@Autowiredprivate AsyncService asyncService;@GetMapping("/asyncWithReturn")public CompletableFuture<String> callAsyncMethodWithReturn() {return asyncService.asyncMethodWithReturn();}
}

4、应用场景

@Async注解适用于各种需要异步处理的场景,例如:

❶ 后台任务处理

在Web应用中,有些任务(如发送邮件生成报告)耗时较长,可以使用@Async异步处理,使用户无需等待任务完成即可获得响应。

❷ 并行处理

对于可以并行处理的任务,如并行数据处理、并行调用多个外部服务,使用@Async可以提高效率。

❸ 提高系统吞吐量

通过异步调用,可以充分利用多线程资源,提高系统的吞吐量和响应速度。


5、常见问题及解决方案

5.1、@Async方法调用无效

如果在同一个类中调用@Async注解的方法,异步调用可能无效。这是因为Spring AOP代理无法拦截同一类中的@Async

解决方法:将异步方法放到另一个类中,通过依赖注入进行调用

5.2、异常处理

异步方法中的异常不会自动传播到调用方。可以使用CompletableFuture处理异常,见下面演示代码

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.concurrent.CompletableFuture;@Service
public class AsyncService {@Asyncpublic CompletableFuture<String> asyncMethodWithException() {try {Thread.sleep(5000); // 模拟耗时操作throw new RuntimeException("异常发生");} catch (InterruptedException e) {e.printStackTrace();}return CompletableFuture.completedFuture("异步方法完成");}
}

处理异常:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.concurrent.CompletableFuture;@RestController
public class AsyncController {@Autowiredprivate AsyncService asyncService;@GetMapping("/asyncWithException")public CompletableFuture<String> callAsyncMethodWithException() {return asyncService.asyncMethodWithException().exceptionally(ex -> "处理异常:" + ex.getMessage());}
}

6、结语

Spring Boot@Async注解提供了一种简洁且强大的方式来实现异步处理。通过启用异步支持、定义异步方法并自定义TaskExecutor,可以高效地处理各种异步任务。掌握@Async注解的使用和原理,有助于提升应用程序的性能和响应速度。

如果本文对您有所帮助,希望 一键三连 给博主一点点鼓励,如果您有任何疑问或建议,请随时留言讨论!


在这里插入图片描述

相关文章:

Spring Boot中@Async注解的使用及原理 + 常见问题及解决方案

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…...

ubuntu基于cmakelist的Qt工程,如何将图片打包进二进制程序

qt界面使用的图片打包进入二进制可执行程序&#xff0c;可以避免发布的软件&#xff0c;因为路径问题无法加载图片的问题。 以下步骤参考自百度AI. 步骤如下&#xff1a; 1.创建一个新的Qt资源文件&#xff08;.qrc文件&#xff09; 2.在*.qrc文件中添加图片路径 qrc文件使用…...

Spring的启动流程refresh方法、配置类解析流程@Component、@Configuration、@Import、@Bean

Spring的启动流程概述&#xff1a; 核心方法&#xff1a; refresh方法&#xff0c;作用就是实例化spring容器中的所有单例。 3步&#xff1a; 生成BeanFactory容器&#xff08;有beanDefinition类信息和bean对象实例&#xff09;生成BeanDefinition类信息生成bean对象实例 需…...

运算放大器(2)

&#xff08;1&#xff09;反向放大器 Vout(-R2/R1)*Vi 图一运放的同向端接地0V&#xff0c;反向端和同向端虚短&#xff0c;所以也是0V 反向输入端输入电阻很高&#xff0c;虚断&#xff0c;几乎没有电流注入和流出&#xff0c;那么R1和R2相当于是串联的&#xff0c;流过一个…...

智能优化算法之模拟退火算法SA

发展历史和算法思想 模拟退火算法&#xff08;Simulated Annealing, SA&#xff09;是一种基于热力学原理的随机优化算法&#xff0c;最早由 S. Kirkpatrick, C. D. Gelatt 和 M. P. Vecchi 于 1983 年提出。算法的灵感来自于固体物理学中的退火过程&#xff1a;通过加热和缓慢…...

同时用到,网页,java程序,数据库的web小应用

具体实现功能&#xff1a;通过网页传输添加用户的请求&#xff0c;需要通过JDBC来向 MySql 添加一个用户数据 第一步&#xff0c;部署所有需要用到的工具 IDEA(2021.1),Tomcat(9),谷歌浏览器&#xff0c;MySql,jdk(17) 第二步&#xff0c;创建java项目&#xff0c;提前部署数…...

星环科技推出语料开发工具TCS,重塑语料管理与应用新纪元

5月30-31日&#xff0c;2024向星力未来数据技术峰会期间&#xff0c;星环科技推出一款创新的语料开发工具——星环语料开发工具TCS&#xff08;Transwarp Corpus Studio&#xff09;&#xff0c;旨在通过全面的语料生命周期管理&#xff0c;极大提升语料开发效率&#xff0c;助…...

【ARM】MDK安装ARM_compiler5无法打开安装程序

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 在客户安装了最新版本的MDK5.37及后续更新版本&#xff0c;但原工程使用ARM_Compiler_5.06进行编译和调试&#xff0c;需安装ARM_Compiler_5.06的编译器版本&#xff0c;但在解压缩的过程中后续无法打开ARM_Compiler…...

PHP文字ocr识别接口示例、人工智能的发展

全球在人工智能升级的大背景下&#xff0c;有一定规模的制造商开始大量部署人工智能机器人、系统&#xff0c;以此取代危险、简单和重复性的工作。各种人工智能技术的迅猛发展&#xff0c;正在驱动各行业就业市场发现变革。 京东物流大家并不陌生&#xff0c;京东快递机器人在…...

【2024 全国青少年信息素养大赛复赛指南】算法创意实践挑战赛复赛、智能算法应用挑战赛复赛指南

目录 2024 全国青少年信息素养大赛算法创意实践挑战赛复赛指南 一、比赛内容 二、编程题作答说明 三、准备说明 四、进入复赛 五、设备检测 六、答题与交卷 全国青少年信息素养大赛智能算法应用挑战赛复赛指南 一、 比赛规则: 二、学生具体操作流程 三、 评判方法…...

构建自定义Tensorflow镜像时用到的链接地址整理

NVIDIA相关&#xff1a; NVIDIA CUDA镜像的docker hub&#xff1a;https://hub.docker.com/r/nvidia/cuda/tags?page&page_size&ordering&name12.4.1NVIDIA 构建的Tensorflow镜像包&#xff1a;https://docs.nvidia.com/deeplearning/frameworks/tensorflow-rele…...

C++——二叉搜索树的实现

1、二叉搜索树的概念 二叉搜索树又叫做二叉排序树&#xff0c;他或者是一棵空树&#xff0c;或者具有以下性质&#xff1a; 若他的左子树不为空&#xff0c;则左子树的所有节点的值都小于根节点的值&#xff0c; 若他的右子树不为空&#xff0c;则右子树的所有节点的值都大于…...

【AppScan】安装教程 AppScan v10 Web应用安全测试工具(附安装包)零基础入门到精通,收藏这一篇就够了

获取方式及安装教程下滑至文章底部查看 此软件“仅限学习交流,不能用于商业用途”&#xff0c;如用于商业用途,请到官方购买正版软件,追究法律责任与本平台无关&#xff01; 配置要求 操作系统&#xff1a;64位 Win10、Win8、Win7 软件介绍 IBM AppScan是一款非常好用…...

Java项目:基于SSM框架实现的中小型企业财务管理系统【ssm+B/S架构+源码+数据库+答辩PPT+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的中小型企业财务管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单…...

c++ - 多态

文章目录 一、多态的概念二、多态使用三、多态的原理 一、多态的概念 1、概念&#xff1a; 多态就是具有多种形态&#xff0c;可以理解为同一个行为不同对象去完成表现出不同的状态&#xff0c;如&#xff1a; 二、多态使用 1、构成多态的条件 &#xff08;1&#xff09;派…...

亚马逊云科技EC2简明教程

&#x1f4a1; 完全适用于新手操作的Amazon EC2引导教程 简述 在亚马逊云科技中&#xff0c;存在多种计算服务&#xff0c;在此&#xff0c;我们将会着重讨论Amazon EC2(以下简称EC2)&#xff0c;EC2作为亚马逊云科技的明星产品、核心产品&#xff0c;是大多数开发者和企业用…...

TCP网络传输控制协议

目录 什么是TCP TCP的特点 TCP通信步骤 三次握手&#xff08;建立连接&#xff09; 数据传输 四次挥手&#xff08;连接释放&#xff09; 为什么要进行三次握手&#xff1f;两次握手行不行&#xff1f;一次握手行不行&#xff1f; 为什么是四次挥手&#xff1f;三次、两…...

PCDN技术如何应对网络带宽限制?(壹)

PCDN技术应对网络带宽限制的操作主要包括以下几个方面&#xff1a; 利用边缘计算资源&#xff1a;PCDN是以P2PCDN技术为基础&#xff0c;通过挖掘利用边缘网络海量碎片化闲置资源来构建内容分发网络。这意味着&#xff0c;当网络带宽受限时&#xff0c;PCDN能够更有效地利用这…...

Java数据结构-链表与LinkedList

链表 链表的概念 链表是一种物理存储结构上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的。 通俗来说&#xff0c;相比较于顺序表&#xff08;物理上连续&#xff0c;逻辑上也连续&#xff09;&#xff0c;链表物理上不一定连续。 链表是…...

单元测试实施最佳方案(背景、实施、覆盖率统计)

1. 什么是单元测试&#xff1f; 对于很多开发人员来说&#xff0c;单元测试一定不陌生 单元测试是白盒测试的一种形式&#xff0c;它的目标是测试软件的最小单元——函数、方法或类。单元测试的主要目的是验证代码的正确性&#xff0c;以确保每个单元按照预期执行。单元测试通…...

mysql笔记(表导出文件,文件导入表)

遇见权限问题1: cat /etc/my.cnf加入[mysqld] secure_file_priv ""遇见目录错误2:因为 MySQL 服务器没有权限在根目录下创建文件。你可以尝试将文件导出到一个 MySQL 服务器有权限写入的目录下&#xff0c;例如 MySQL 数据目录或 /tmp目录。sudo chmod 755 /path/to…...

Navicat 17 新特性 | 原生支持 Linux ARM 平台以及银河麒麟和统信操作系统

随着 Navicat 17 的发布&#xff0c;引起了业界的广泛共鸣与热烈讨论。此前&#xff0c;我们深入探讨了Navicat 17的多项新特性&#xff0c;涵盖《模型设计&#xff1a;引领创新&#xff0c;优化升级》&#xff0c;《高效的查询与配置》以及《用户界面交互&#xff1a;流畅体验…...

【pytorch】手写数字识别

https://blog.csdn.net/qq_45588019/article/details/120935828 基本均参考该博客 《深度学习原理Pytorch实战》 初步处理 导包 import torch import numpy as np from matplotlib import pyplot as plt from torch.utils.data import DataLoader from torchvision import tr…...

SpringBoot3.3.0升级方案

本文介绍了由SpringBoot2升级到SpringBoot3.3.0升级方案&#xff0c;新版本的升级可以解决旧版本存在的部分漏洞问题。 一、jdk17下载安装 1、下载 官网下载地址 Java Archive Downloads - Java SE 17 Jdk17下载后&#xff0c;可不设置系统变量java_home&#xff0c;仅在id…...

用 Kotlin 编写四则运算计算器:从零开始的简单教程

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…...

java算法day13

java算法day13 104 二叉树的最大深度111 二叉树的最小深度226 翻转二叉树101 对称二叉树100 相同的树 104 二叉树的最大深度 我最开始想到的是用层序遍历。处理每一层然后计数。思路非常的清楚。 迭代法&#xff1a; /*** Definition for a binary tree node.* public class…...

方便快捷传文件—搭建rsync文件传输服务器

比如我们有一个服务器&#xff0c;想把各个机器的文件都通过脚本传给这台机&#xff0c;用sftp或者直接rsync就必须输密码&#xff0c;肯定不行&#xff0c;做等效性免密又麻烦&#xff0c;怎么办呢&#xff0c;这么办&#xff01; 在服务端 yum -y install rsync #编辑&…...

python调用qt编写的dll

报错&#xff1a;FileNotFoundError: Could not find module F:\pythonProject\MINGW\sgp4Lib.dll (or one of its dependencies). Try using the full path with constructor syntax. 只有两种情况&#xff1a; 1.路径不对 2.库的依赖不全 1、如果是使用了qt库的&#xff0…...

SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测

SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测 目录 SCI一区级 | Matlab实现NGO-CNN-LSTM-Mutilhead-Attention多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现NGO-CNN-LSTM-Mutilhead-Attention北方苍鹰算…...

【Redis】初识 Redis

文章目录 1 什么是 Redis2 Redis 的特点2.1 速度快2.2 可编程性2.3 可拓展性2.4 持久化2.5 主从复制2.5 高可用和分布式2.6 客户端语言多 3 Redis 使用场景3.1 实时数据存储3.2 缓存和 Session 存储3.3 消息队列 4 Redis 重大版本5 CentOS7 安装 Redis5 1 什么是 Redis Redis …...

wordpress的开发文档/搜索引擎数据库

今天总算是机缘巧合的找到了照样一篇纲要性质的文章。 如是能早一些找到就好了。不过“在你认为为时已晚的时候&#xff0c;其实还为时未晚”倒是也能聊以自慰&#xff0c;不过不能经常这样迷惑自己&#xff0c;毕竟我需要开始跑了&#xff01; 就照着这个大纲往下走走&#xf…...

数据库里建设好的网站为什么外网进不去网站/建立一个企业网站需要多少钱

我是selenium的新手,我正在尝试使用Selenium IDE(2.9.0)创建一个基本的第一个单击和记录脚本,然后我使用Selenium WebDriver(2.48.0)进行优化.我录制了一个工作脚本(参见本问题末尾的附件),并将其导出为“python 2 / unittest / WebDriver”.但是,源代码清楚地表明它存在一些问…...

php动态网站开发简答题/百度seo推广怎么收费

测试原理&#xff0c;停掉源端和目标端的OGG&#xff0c; 在源端进行DML操作&#xff0c;然后切换日志。然后开启源端和目标端的OGG。看看是否会同步数据到目标端。另外查看源端的ext进程日志&#xff0c;看里面的提示。 结论&#xff1a; OGG 在停掉后&#xff0c;进行大批量的…...

预付网站制作费怎么做凭证/百度账号登录入口

1.js创建私有属性的方法 在 javascript 中所有对象的成员是公有的 构造函数也是如此: 1 function Gadget ( ) { 2 this.name jack ; 3 this.putName function ( ) { 4 return ( this is jack ); 5 } 6 } 7 var obj new Gadget(); 8 console.log( obj.…...

怎样做网站搜索推广电话成都/潍坊百度关键词优化

要共享的目录-右键 然后点击下面共享 复制链接给另一人 另一台电脑输入链接&#xff0c;就可以访问了...

美容院门户网站开发/百度关键词查询

Android Studio 3.0 之后Tools没有Android选项&#xff0c;想打开monitor查看文件就不行&#xff0c;解决方法&#xff1a; 这样即可找到虚拟机或者真机的文件。 如果是真机的文件&#xff0c;一定要记得小心哦。...