什么情况下会导致@Async异步方法会失效?
生活随笔
收集整理的這篇文章主要介紹了
什么情况下会导致@Async异步方法会失效?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
什么情況下會導致@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异步方法会失效?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小艾机器人apk_小艾QQ群机器人安卓版
- 下一篇: php长篇特点,《细说PHP》特色