什么情况下会导致@Async异步方法会失效?

a.调用同一个类下注有@Async异步方法:在spring中像@Async和@Transactional、cache等注解本质使用的是动态代理,其实Spring容器在初始化的时候Spring容器会将含有AOP注解的类对象“替换”为代理对象(简单这么理解),那么注解失效的原因就很明显了,就是因为调用方法的是对象本身而不是代理对象,因为没有经过Spring容器,那么解决方法也会沿着这个思路来解决。

b.调用的是静态(static )方法

c.调用(private)私有化方法

解决4中问题1的方式(其它2,3两个问题自己注意下就可以了)

将要异步执行的方法单独抽取成一个类,原理就是当你把执行异步的方法单独抽取成一个类的时候,这个类肯定是被Spring管理的,其他Spring组件需要调用的时候肯定会注入进去,这时候实际上注入进去的就是代理类了。

其实我们的注入对象都是从Spring容器中给当前Spring组件进行成员变量的赋值,由于某些类使用了AOP注解,那么实际上在Spring容器中实际存在的是它的代理对象。那么我们就可以通过上下文获取自己的代理对象调用异步方法。

@Controller
@RequestMapping("/app")
public class EmailController {//获取ApplicationContext对象方式有多种,这种最简单,其它的大家自行了解一下@Autowiredprivate ApplicationContext applicationContext;@RequestMapping(value = "/email/asyncCall", method = GET)@ResponseBodypublic Map<String, Object> asyncCall () {Map<String, Object> resMap = new HashMap<String, Object>();try{//这样调用同类下的异步方法是不起作用的//this.testAsyncTask();//通过上下文获取自己的代理对象调用异步方法EmailController emailController = (EmailController)applicationContext.getBean(EmailController.class);emailController.testAsyncTask();resMap.put("code",200);}catch (Exception e) {resMap.put("code",400);logger.error("error!",e);}return resMap;}//注意一定是public,且是非static方法@Asyncpublic void testAsyncTask() throws InterruptedException {Thread.sleep(10000);System.out.println("异步任务执行完成!");}}

什么情况下会导致@Async异步方法会失效?相关推荐

  1. 什么情况下会导致跨域

    什么情况下会导致跨域 协议 端口号 域名不相同就会发生跨域

  2. 损害计算机系统,哪些情况下容易导致电脑系统崩溃损坏?

    今天我为大家介绍下什么情况可能会导致电脑系统崩溃,哪些不当操作可以致使电脑系统崩溃蓝屏损坏.电脑系统是一台健康电脑的标志,正确使用电脑会给你带来愉快,不正确的使用电脑会给你带来烦恼.我们有的时候也是比 ...

  3. Android面试每日一题(4): 哪些情况下会导致oom问题?

    1.根据java的内存模型会出现内存溢出的内存有堆内存.方法区内存.虚拟机栈内存.native方法区内存: 2.一般说的OOM基本都是针对堆内存: 3.对于堆内存溢出主的根本原因有两种 (1)app进 ...

  4. RTSP协议视频智能分析平台EasyNVR在编码格式不同的情况下会导致视频无法播放吗?

    RTSP协议的视频智能分析平台EasyNVR内接入的视频通道可以通过平台进行网页直播,并且支持市面上大部分的RTSP/Onvif协议设备:IP Camera/NVR/DVR/编码器等,直播便捷稳定,是 ...

  5. 什么情况下会导致内存泄露

    Android的虚拟机是基于寄存器的Dalvik,它的最大堆大小一般是16M,有的可能是24M,当我们的内存占用超过了一定的程度后,就会出现OutOfMemory的错误. 下面说明几点可能导致内存泄露 ...

  6. promise在promise情况下进行使用async与await

    使用是不一样的 https://www.cnblogs.com/sexintercourse/p/12285157.html https://zhuanlan.zhihu.com/p/14718474 ...

  7. 导出坏块表oracle,obj$坏块情况下exp导出单个表解决方案

    在前面一篇(obj$坏块exp不能执行原因探讨)已经研究了在obj$出现坏块的情况下,导致exp导出单个表不能成功的原因,这篇给出解决方案 1.重新创建exu81javt视图 SQL> CREA ...

  8. 数据查询必备技能SQL调优:Mysql什么情况下不走索引

    背景分析 今天领导在查询报表时,发现特别慢,于是引发一系列关于sql优化的工作,最终发现是分析同学在进行多表关联时进行不等值关联造成全表扫描,且使用字段无索引造成1W条数据表和20W数据表关联时执行缓 ...

  9. mysql锁表查询_Mysql数据库锁情况下开启备份导致数据库无法访问处理分享

    [背景简介] MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),因为其速度.可靠性和适应性而备受关注.大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择.mysql ...

最新文章

  1. ubi-partman failed with exit code 141
  2. 职场警示录:栽在邮件上的N种死法
  3. jQuery查找标签--选择器,筛选器,模态对话框, 左侧菜单栏
  4. 计算机视觉实战(五)图像梯度计算
  5. 学习shell script
  6. atitit 数据库mysq启动不起来解决方案.docx
  7. cfa英语不好的怎么学_别把没兴趣作为学不好英语的借口
  8. CXF学习创建WebService
  9. 重装系统后电脑只剩下C盘怎么办?怎样给电脑磁盘分区增加盘符?
  10. WindRiver WorkBench创建、编译vxWorks APP工程
  11. keil编译出现多重定义的问题
  12. CS:APP CH02信息的表示和处理知识点总结
  13. 用迭代器指针改变map容器的值
  14. astah_激活步骤
  15. UN Comtrade(联合国商品贸易统计数据库)数据爬取Python代码
  16. 小程序转App最便捷的方法,附实操
  17. 趣味编程故事|java进程占用cpu过高怎么办,别急我来帮你
  18. 什么是工厂模式、代理模式?
  19. NET 数据结构-单链表
  20. 为什么微信截图无法截取其他软件中的下拉菜单

热门文章

  1. 如何添加地图控件到Windows Phone 8的页面中
  2. C#实现RTP数据包传输
  3. 自动驾驶汽车定位技术
  4. js日期比较大小_node.js 内存泄漏的秘密
  5. Pytorch的C++接口实践
  6. This is Me!——回顾第一个项目的前前后后
  7. 事务的传播性和隔离级别
  8. 网站如何接入第三方登录,微信登录和QQ登录:注册认证篇
  9. 【BootStrap】 概述 CSS
  10. poj 1201 差分约束