最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用Async注解失效原因分析及解決(spring異步回調(diào))

 更新時(shí)間:2021年10月18日 11:11:35   作者:u011277123  
這篇文章主要介紹了SpringBoot使用Async注解失效原因分析及解決(spring異步回調(diào)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Async注解失效原因分析及解決(spring異步回調(diào))

Spring中@Async

在Java應(yīng)用中,絕大多數(shù)情況下都是通過同步的方式來實(shí)現(xiàn)交互處理的;但是在處理與第三方系統(tǒng)交互的時(shí)候,容易造成響應(yīng)遲緩的情況,之前大部分都是使用多線程來完成此類任務(wù),其實(shí),在spring 3.x之后,就已經(jīng)內(nèi)置了@Async來完美解決這個(gè)問題

有時(shí)候在使用的過程中@Async注解會(huì)失效

(原因和@Transactional注解有時(shí)候會(huì)失效的原因一樣)。

下面定義一個(gè)Service:

兩個(gè)異步執(zhí)行的方法test03()和test02()用來模擬項(xiàng)目中可能出現(xiàn)的耗時(shí)操作,然后test()方法調(diào)用這兩個(gè)耗時(shí)的方法:

SpringBoot使用Async注解失效分析、解決(spring異步回調(diào))

定義Controller:

SpringBoot使用Async注解失效分析、解決(spring異步回調(diào))

執(zhí)行方法,返回結(jié)果:

SpringBoot使用Async注解失效分析、解決(spring異步回調(diào))

方法執(zhí)行結(jié)果明顯與我們的預(yù)期不符,方法的輸出順序表示了test02()和test03()兩個(gè)異步方法居然同步執(zhí)行了,也就是說@Aysnc注解失效了!

失效的原因是因?yàn)槲覀兪窃趖est()方法中直接調(diào)用的test02()和test03()方法,相當(dāng)于是this.test02()和this.test03()調(diào)用的,也就是說真正調(diào)用test02()和test03()方法的是TestService對(duì)象本身調(diào)用的,而@Async和@Transactional注解本質(zhì)使用的是動(dòng)態(tài)代理,真正應(yīng)該是TestService的代理對(duì)象調(diào)用test02()和test03()方法。其實(shí)Spring容器在初始化的時(shí)候Spring容器會(huì)將含有AOP注解的類對(duì)象“替換”為代理對(duì)象(簡單這么理解),那么注解失效的原因就很明顯了,就是因?yàn)檎{(diào)用方法的是對(duì)象本身而不是代理對(duì)象,因?yàn)闆]有經(jīng)過Spring容器,那么解決方法也會(huì)沿著這個(gè)思路來解決。

網(wǎng)上有不少博客說解決方法就是將要異步執(zhí)行的方法單獨(dú)抽取成一個(gè)類,這樣的確可以解決異步注解失效的問題,原理就是當(dāng)你把執(zhí)行異步的方法單獨(dú)抽取成一個(gè)類的時(shí)候,這個(gè)類肯定是被Spring管理的,其他Spring組件需要調(diào)用的時(shí)候肯定會(huì)注入進(jìn)去,這時(shí)候?qū)嶋H上注入進(jìn)去的就是代理類了,其實(shí)還有其他的解決方法,并不一定非要單獨(dú)抽取成一個(gè)類。

解決方式一

在TestService中通過上下文獲取自己的代理對(duì)象調(diào)用異步方法

其實(shí)我們的注入對(duì)象都是從Spring容器中給當(dāng)前Spring組件進(jìn)行成員變量的賦值,由于TestService使用了AOP注解,那么實(shí)際上TestService在Spring容器中實(shí)際存在的是它的代理對(duì)象。

SpringBoot使用Async注解失效分析、解決(spring異步回調(diào))

執(zhí)行結(jié)果,異步方法異步執(zhí)行了:

SpringBoot使用Async注解失效分析、解決(spring異步回調(diào))

解決方式二

開啟cglib代理,手動(dòng)獲取Spring代理類

在啟動(dòng)類上加上:

SpringBoot使用Async注解失效分析、解決(spring異步回調(diào))

使用AopContext.currentProxy()獲取當(dāng)前代理類:

這里為了證明Spring容器中的對(duì)象就是當(dāng)前代理類對(duì)象特地輸出了一句話:

SpringBoot使用Async注解失效分析、解決(spring異步回調(diào))

運(yùn)行結(jié)果:

SpringBoot使用Async注解失效分析、解決(spring異步回調(diào))

OK,問題完美解決!

application.properties配置如下:

#java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.
# 增加@EnableAspectJAutoProxy
spring.aop.auto=true
#開啟CGLIB代理
spring.aop.proxy-target-class=true

springboot @Async 失效可能原因

1、當(dāng)前類中其他函數(shù)調(diào)用有 @Async 注解的函數(shù)

2、當(dāng)前類中有多態(tài),方法名相同

3、啟動(dòng)類未加@EnableAsync

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 向Spring IOC 容器動(dòng)態(tài)注冊(cè)bean實(shí)現(xiàn)方式

    向Spring IOC 容器動(dòng)態(tài)注冊(cè)bean實(shí)現(xiàn)方式

    這篇文章主要為大家介紹了向Spring IOC 容器動(dòng)態(tài)注冊(cè)bean實(shí)現(xiàn)方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • java中ImageReader和BufferedImage獲取圖片尺寸實(shí)例

    java中ImageReader和BufferedImage獲取圖片尺寸實(shí)例

    這篇文章主要介紹了java中ImageReader和BufferedImage獲取圖片尺寸實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • SpringBoot中Dozer的使用小結(jié)

    SpringBoot中Dozer的使用小結(jié)

    dozer是用來兩個(gè)對(duì)象之間屬性轉(zhuǎn)換的工具,有了這個(gè)工具之后,我們將一個(gè)對(duì)象的所有屬性值轉(zhuǎn)給另一個(gè)對(duì)象時(shí),就不需要再去寫重復(fù)的set和get方法了,下面介紹下SpringBoot中Dozer的使用,感興趣的朋友一起看看吧
    2022-03-03
  • java實(shí)現(xiàn)郵件發(fā)送

    java實(shí)現(xiàn)郵件發(fā)送

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)郵件發(fā)送,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • Spring Boot 緩存 Cache 入門詳解

    Spring Boot 緩存 Cache 入門詳解

    本文主要介紹SpringBoot緩存的入門知識(shí),包括緩存的必要性、常見的緩存策略、SpringCache的注解使用、SpringBoot與緩存的集成以及Ehcache和Redis的示例,同時(shí),還提供了緩存面試問題的思路和答案,幫助讀者更好地理解和掌握SpringBoot緩存的相關(guān)內(nèi)容,感興趣的朋友一起看看吧
    2025-03-03
  • JVM內(nèi)存飆升線上問題排查方式

    JVM內(nèi)存飆升線上問題排查方式

    文章主要介紹了線上CMS服務(wù)內(nèi)存增長問題的排查過程,通過分析GC日志和堆??煺?定位問題為Nacos的NamingService對(duì)象無法回收和MySQL的CallableStatement對(duì)象增長迅速,最終通過將NamingService改為單例模式解決了內(nèi)存增長問題
    2025-03-03
  • Java經(jīng)典設(shè)計(jì)模式之適配器模式原理與用法詳解

    Java經(jīng)典設(shè)計(jì)模式之適配器模式原理與用法詳解

    這篇文章主要介紹了Java經(jīng)典設(shè)計(jì)模式之適配器模式,簡單說明了適配器模式的概念、原理,并結(jié)合實(shí)例形式分析了java適配器模式的用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • 詳解JAVA生成將圖片存入數(shù)據(jù)庫的sql語句實(shí)現(xiàn)方法

    詳解JAVA生成將圖片存入數(shù)據(jù)庫的sql語句實(shí)現(xiàn)方法

    這篇文章主要介紹了詳解JAVA生成將圖片存入數(shù)據(jù)庫的sql語句實(shí)現(xiàn)方法的相關(guān)資料,這里就是實(shí)現(xiàn)java生成圖片并存入數(shù)據(jù)庫的實(shí)例,需要的朋友可以參考下
    2017-08-08
  • SpringBoot深入探究@Conditional條件裝配的使用

    SpringBoot深入探究@Conditional條件裝配的使用

    這篇文章主要為大家介紹了SpringBoot底層注解@Conditional的使用分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Java 位圖法排序的使用方法

    Java 位圖法排序的使用方法

    本篇文章,小編將為大家介紹關(guān)于Java 位圖法排序的使用方法,有需要的朋友可以參考一下
    2013-04-04

最新評(píng)論

武川县| 庐江县| 安多县| 西丰县| 巫溪县| 许昌县| 湘乡市| 岳普湖县| 鹿泉市| 平南县| 丹凤县| 潞城市| 新干县| 上高县| 汝城县| 龙门县| 当雄县| 江油市| 澄迈县| 扬州市| 莆田市| 于都县| 锡林浩特市| 东光县| 贡嘎县| 彩票| 白玉县| 开化县| 瓦房店市| 翁牛特旗| 天柱县| 嘉禾县| 敦化市| 张家港市| 仁寿县| 万载县| 出国| 渭南市| 梁河县| 龙山县| 黄大仙区|