最新国产好看的视频,伊人天堂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ù)情況下都是通過(guò)同步的方式來(lái)實(shí)現(xiàn)交互處理的;但是在處理與第三方系統(tǒng)交互的時(shí)候,容易造成響應(yīng)遲緩的情況,之前大部分都是使用多線程來(lái)完成此類任務(wù),其實(shí),在spring 3.x之后,就已經(jīng)內(nèi)置了@Async來(lái)完美解決這個(gè)問(wèn)題

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

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

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

兩個(gè)異步執(zhí)行的方法test03()和test02()用來(lái)模擬項(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í)行了,也就是說(shuō)@Aysnc注解失效了!

失效的原因是因?yàn)槲覀兪窃趖est()方法中直接調(diào)用的test02()和test03()方法,相當(dāng)于是this.test02()和this.test03()調(diào)用的,也就是說(shuō)真正調(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ì)象(簡(jiǎn)單這么理解),那么注解失效的原因就很明顯了,就是因?yàn)檎{(diào)用方法的是對(duì)象本身而不是代理對(duì)象,因?yàn)闆](méi)有經(jīng)過(guò)Spring容器,那么解決方法也會(huì)沿著這個(gè)思路來(lái)解決。

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

解決方式一

在TestService中通過(guò)上下文獲取自己的代理對(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))

解決方式二

開(kāi)啟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,問(wèn)題完美解決!

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
#開(kāi)啟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是用來(lái)兩個(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í),包括緩存的必要性、常見(jiàn)的緩存策略、SpringCache的注解使用、SpringBoot與緩存的集成以及Ehcache和Redis的示例,同時(shí),還提供了緩存面試問(wèn)題的思路和答案,幫助讀者更好地理解和掌握SpringBoot緩存的相關(guān)內(nèi)容,感興趣的朋友一起看看吧
    2025-03-03
  • JVM內(nèi)存飆升線上問(wèn)題排查方式

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

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

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

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

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

    這篇文章主要介紹了詳解JAVA生成將圖片存入數(shù)據(jù)庫(kù)的sql語(yǔ)句實(shí)現(xiàn)方法的相關(guān)資料,這里就是實(shí)現(xiàn)java生成圖片并存入數(shù)據(jù)庫(kù)的實(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)論

和政县| 刚察县| 三穗县| 临汾市| 邳州市| 盘山县| 宁化县| 龙岩市| 太仆寺旗| 潜山县| 定南县| 浙江省| 南和县| 易门县| 汕尾市| 临漳县| 翁源县| 故城县| 昆明市| 海口市| 隆化县| 鄢陵县| 盐池县| 齐齐哈尔市| 斗六市| 嵊州市| 广元市| 赤城县| 尉氏县| 九龙县| 恭城| 渑池县| 祥云县| 榆社县| 青浦区| 安化县| 武功县| 元氏县| 平定县| 桐乡市| 金溪县|