【Java异步】解决@Async注解,同类下调用不生效

@Async异步失效的9种场景 最近有粉丝问了我一个问题:他在项目某个方法使用@Async注解,但是该方法还是同步执行了,异步不起作用,到底是什么原因呢?@Slf4j@Service@Async这个问题还是比较有意思的,今天这篇文章总结了@Async注解失效的9种场景,希望对你会有所帮助。如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描下发二维码关注一下,您的支持是我坚持写作最大的动力。 阅读详情
AI摘要

本文围绕Java中@Async注解展开,它是Spring框架用于实现异步方法调用的注解。介绍了基本使用方法,分析了同类下@Async不生效的根本原因,包括代理对象隔离和代理类型差异。还给出了解决方案,如将异步方法拆分到不同类,或通过代理对象调用。

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述


一、@Async注解

@Async 是 Spring 框架中用于实现异步方法调用的注解

基本使用

1、启用异步支持 在配置类添加 @EnableAsync

   @Configuration
   @EnableAsync
   public class AsyncConfig {}

2、标注异步方法,在需要异步的方法条件 @Async

   @Service
   public class EmailService {
       @Async
       public void sendAsyncEmail(String content) {
           // 耗时操作(如发送邮件)
       }
   }

二、为什么同类下@Async不生效

根本原因

Spring 通过 动态代理 实现 @Async 的异步能力:

1、代理对象隔离

  • 当调用被 @Async 注解的方法时,实际调用的是代理对象的方法
  • 同类中的内部调用(如 this.method())直接访问原始对象,绕过了代理

2、代理类型差异

  • 如果使用 JDK 动态代理(基于接口),同类调用无法触发代理逻辑
  • 如果使用 CGLIB 代理(无接口类),同类调用同样受限于 this 调用

内部调用失效案例

@Service
public class OrderService {

    // ✅ 外部调用有效
    public void createOrder() {
        sendAsyncMsg(); // 通过代理对象调用
    }

    // ❌ 同类调用无效
    public void batchCreateOrders() {
        this.sendAsyncMsg(); // 直接调用原始对象方法
    }

    @Async
    public void sendAsyncMsg() {
        // 异步发送消息
    }
}

三、解决方案

方式1 异步方法拆分到不同类

// 异步操作单独成类
@Service
public class AsyncMessageService {
    @Async
    public void sendAsyncMsg() {
        // 异步逻辑
    }
}

// 主业务类通过依赖注入调用
@Service
@RequiredArgsConstructor
public class OrderService {
    private final AsyncMessageService asyncMessageService;

    public void batchCreateOrders() {
        asyncMessageService.sendAsyncMsg(); // 通过代理对象调用
    }
}

方式2 通过代理对象调用

  • 配置类添加配置exposeProxy = true
   @EnableAspectJAutoProxy(exposeProxy = true) // 配置类添加
   @Configuration
   @EnableAsync
   public class AsyncConfig {}
  • 同类下通过代理对象调用异步方法
@Service
public class OrderService {
	//AopContext上下文获取当前代理对象,调用异步方法
	public void batchCreateOrders() {
  	  ((OrderService) AopContext.currentProxy()).sendAsyncMsg();
	}

    @Async
    public void sendAsyncMsg() {
        // 异步逻辑
    }
}



在这里插入图片描述

@Async 注解不生效的常见原因及解决方案 Async不生效的常见原因包括未启用异步支持方法调用方式错误线程池未配置和异常未处理。添加。确保通过代理对象调用异步方法。配置自定义线程池。处理异步方法异常。验证方法作用域和 Bean 管理状态。正确配置后,异步方法将按预期在独立线程中执行,显著提升系统并发性能。 阅读详情

相关推荐

@Async 异步不起作用

一、异步接口实现 java中的异步接口实现比较简单,主要有两步: 1、在ContentServiceApplication上添加@EnableAsync。 2、在需要异步的接口上添加@Async接口。 // 第一步 @EnableAsync public class ContentServiceApplication { public static void main(String[] args) { SpringApplication.run(ContentServiceA

隔壁老王呀的专栏 3166

@Async修饰不生效

Async注解只能用于Spring容器管理的Bean中,如果方法没有被Spring容器管理,则@Async注解也不会生效。没有在启动类上添加@EnableAsync注解。在使用@Async注解时,需要在启动类上添加@EnableAsync注解,否则@Async注解将不会生效。异步方法和调用方法在同一个类中。如果异步方法和调用方法在同一个类中,@Async注解也不会生效,因为Spring无法创建代理对象。以上是一些常见的@Async注解不生效的原因,你可以根据具体情况进行排查。

小灰~的博客 4068

Java异步注解@Async详解

再查看一下initializeExecutor抽象方法的具体实现类,其中有一个就是ThreadPoolTaskExecutor类,查看它的initializeExecutor方法,使用的就是ThreadPoolExecutor。在需要异步执行的方法上加入@Async注解,并指定使用的线程池,当然可以不指定,直接写@Async。的名称,也就是不自定义线程池,@Async是有默认线程池的,使用的是Spring默认的线程池SimpleAsyncTaskExecutor。配置文件中的线程池核心线程数为何配置为。

Jack章臣的博客 2万+

@Async失效情况

@Async失效情况

ElendaLee的专栏 1万+

Spring @Async注解实现异步任务

1. Spring对任务调度和异步任务执行的支持 Spring提供了如下注解用于支持任务调用和异步方法执行: @Scheduled:任务调度 @Async:异步方法执行 启用任务调度和异步方法执行的注解: @EnableScheduling:启用任务调度,在@Configuration类中使用。如果需要更加细粒度的控制,可以实现SchedulingConfigur...

甘蓝的专栏 2586

常见的电容有哪些

电容在电路板中非常常见,类别纷繁复杂,本文化繁为简,主要介绍下常见电容。

qq_40170041的博客 768

【异步任务】@Async注解使用方法及注解失效解决办法

SpringBoot框架下的@Async使用方及注解失效的可能问题和解决方法

God_WZH的博客 1万+

ch32v103xx 烧写

烧写方式 串口uart, usb,swd(wch link)但不建议按此使用,参官方说明。

qq_39239990的博客 637

@Async 注解为什么不生效?如何排查?

在 Spring 应用中,@Async 注解是实现异步编程的重要方式之一。它允许我们将某些方法异步执行,从而提升系统的响应能力与处理性能。然而,很多开发者在使用 @Async 时会遇到“注解不生效”的问题。

x² 2151

Unity UI适配实战:从Canvas Scaler到主流游戏适配方案解析

本文深入解析Unity UI适配的核心技术,重点介绍Canvas Scaler组件的关键参数如Reference Resolution和Screen Match Mode,并提供主流游戏适配方案实战分析。通过九宫格拉伸、动态调整等技巧,帮助开发者解决多设备适配难题,提升游戏UI在不同分辨率下的表现。

weixin_29001419的博客 970

头歌操作系统2023春季课堂练习2.1:外部中断

本关任务:通过相关知识以及实验回答:版本 1 内核的第 6 次时钟中断发生时,断点和恢复点(指令地址)分别是多少?回答问题:当第一行 0/1 字符全部输出完毕的时候一共发生了几次时钟中断,即第一行完全填满时 jiffies 记录的已发生次数为多少?本关任务:通过实际操作回答在输出第一行 0/1 字符的过程中(如下图所示),共发生了几次时钟中断?2.此时 bochs 虚拟机输出的 0/1 字符串是什么?(只填写数字,不填写空格!根据相关知识进行实际操作,一直输入 c 直到 0/1 将第一行完全填满。

weixin_64821608的博客 8125

关于 SpringBoot 注解@Async不生效的解决方法(异步处理)

springboot用过@Async注解实现异步处理的方法与解决方案

weixin_51968184的博客 6349

别让IO口保护二极管坑了你!实测讲解单片机电流倒灌的三种典型症状与防护

本文深入解析单片机电流倒灌的三大典型症状与防护方案,重点分析STM32等单片机在ADC采样异常、系统假死和通信速率异常中的表现。通过实测数据和电路设计建议,提供从基础二极管隔离到专业隔离器件的分级防护策略,帮助工程师有效预防和解决电流倒灌问题。

weixin_29280219的博客 344

Spring 框架——@Async 注解

同步调用特点:调用方在发起方法调用后,必须等待被调用的方法完成并返回结果之后,才能继续执行后续的操作(即会阻塞)。在同步调用中,调用方和被调用方的执行顺序是严格按照调用顺序进行的。适用场景:依赖顺序:当某个操作必须在另一个操作完成后才能进行时。简单任务:当任务执行时间短且没有并发问题时。确保执行顺序:需要确保多个步骤按顺序完成,比如数据库事务处理。异步调用特点:调用方发起方法调用后,不必等待被调用的方法完成,而是可以继续执行后续的操作。

web15870359587的博客 6356

抖音最新风控体系研究

小编从技术角度对抖音的风控史和落地目标,跟大家聊一聊抖音,包括海外版抖音TikTok的现状与生态。 1、非常非常早的时期,抖音刚出来的时候,没有任何封禁,这个阶段,导入一个开发库,加上一个请求头,咵咵咵的数据随便拿。 2、2018-2019年,抖音加入了设备id和xg机制,在绝大多数的接口中,携带了设备id参数,同时在请求头中加入了xg,如今的apk市场,能追溯到的最早xg是0200打头的,而小编见过的最早的xg是0000打头的。这个时期的接口,这些参数都还只是预设,没有实际的用处,设备随便写,

qq517348412的博客 1万+

【ESP32接入国产大模型之Deepseek】

🥳🥳🥳现在,我们在本教程中,您学习了如何使用ESP32接入语言大模型之Deepseek。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,后期会持续分享esp32跑freertos实用案列🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣如果你有任何问题,可以通过q group(945348278)加入鹏鹏小分队,期待与你思维的碰撞😘😘😘鸣谢B站UP星汇极客ESP32对接DeepSeek API,实现AI大模型交互功能。

vor234的博客 1万+

Spring的异步详解(@Async)

Spring之异步任务@Async详解分析

陌上花开的博客 2022

YOLOv11改进策略【卷积层】| ICCV-2023 引入Dynamic Snake Convolution动态蛇形卷积,改进C3k2

基于拓扑几何约束的动态蛇卷积用于管状结构分割DSConv(Dynamic Snake Convolution,动态蛇形卷积)模块的设计主要是为了更好地处理管状结构的分割任务,解决传统卷积在处理细管状结构时的不足。

Limiiiing的博客 1627

@Async注解

在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的;但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后,就已经内置了@Async来完美解决这个问题。 @Async注解使用条件: @Async注解一般用在类的方法上,如果用在类上,那么这个类所有的方法都是异步执行的; 所使用的@Async注解方法的类对象...

Serena0814的博客 3596

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java注解详解:@Async异步

是 Spring 框架里的一个小工具,能让你的方法在后台偷偷跑起来,不影响主线程的工作。这个方法特别适合用来处理那些不需要立即给用户反馈的任务,比如发个邮件啊,处理个大文件啥的。通过这个机制,Spring 可以非常方便地处理大量并发任务,提升应用的性能和响应速度。你可以通过配置线程池来管理这些异步任务的执行,比如设置线程的数量、任务队列的大小等。注解,Spring 会创建一个代理对象来处理这个方法的调用。所以,异步执行的效果其实是由后台的线程池来实现的。,它会为每个任务创建一个新的线程。

m0_48038376的博客 2639

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

@Async注解使用方法及注解失效解决办法

首先在application.yml文件中自定义一些键值对。mytask:execution:pool:然后编写一个集成了AsyncConfig的配置类// 如果没有在启动类上加注解,在异步任务配置类中加也是可以的@Overridetry {});@Override// 自定义异常处理逻辑System.err.println("异步方法执行异常: " + method.getName());这样在启动上述任务,就会打印出修改后的线程名称。

qq_41860765的博客 1015

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

springboot 异步 @Async 的日常使用及失效场景

从上面的 @Async 使用我们看到,添加注解的异步方法在一个单独的类 AsyncService 中,然后注入到 AsyncTestService 中进行调用。在 Springboot 中要开启@Async注解异步的功能,需要在项目的启动类,或者配置类上,使用@EnableAsync注解。使用@Async注解声明的方法,必须是能被重写的,很显然static修饰的方法,是类的静态方法,是不允许被重写的。@EnableAsync注解相当于一个开关,控制是否开启@Async注解异步的功能,默认是关闭的。

m0_58680865的博客 1580
上一篇: 【SeaTunnel】分布式数据集成平台SeaTunnel
下一篇: 【AI Prompt】优质AI提示词模板 (附赠小红书爆款标题生成提示)
.29.
.29. 2022 社区之星年度评选TOP 30 2022 社区之星年度评选TOP 30
博客等级 码龄5年 1万+粉丝 203原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.29.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值