Spring?AOPr如何打通兩個切面之間的通信
場景描述
在秒殺微服務(wù)中,筆者在需要各種校驗前端傳來的參數(shù)后,通過 Redis 加鎖限流(切面A)并返回,最后封裝訂單數(shù)據(jù)推送到 RabbitMQ 消息隊列(切面B)做善后工作。
問題:如何將 切面 A 的數(shù)據(jù)傳遞 給切面B 處理呢?
/** * 添加到秒殺流程 * * @param killId 秒殺商品緩存鍵 sessionId_skuId * @param key 隨機碼 randomCode * @param num 數(shù)量 * @return {@link R} */ @GetMapping("/kill") public R addToSeckill( @RequestParam("killId") String killId, @RequestParam("key") String key, @RequestParam("num") Integer num) { // 實現(xiàn)類只是帶有兩個注解方法,返回 null(因為全部交給切面托管了) String orderSn = seckillService.kill(killId, key, num); if (StringUtils.isEmpty(orderSn)) { return R.error(); } return R.ok().setData(orderSn); }
解決方案
通過參數(shù)傳遞數(shù)據(jù),通過捕獲異常保證業(yè)務(wù)邏輯(離譜但有用) ??
// 強制修改參數(shù),通過異常返回正常流程,而通過AOP消息隊列處理收尾動作 try { return pjp.proceed(new Object[]{orderTo, null, null}); } catch (Throwable e) { return orderSn; }
注意事項:
參數(shù)一致性:必須偽造和方法簽名的數(shù)量相等的參數(shù) ⇒ 否則線程會拋出異常 I 就返回了,無法執(zhí)行
pjp.proceed
原始方法 ⇒ 無法跳轉(zhuǎn)第二個切面java.lang.IllegalArgumentException: Expecting 3 arguments to proceed, but was passed 1 arguments
捕獲異常不拋出,直接執(zhí)行正常業(yè)務(wù)邏輯 ⇒ 否則線程將吞沒異常 II
cn.miozus.gulimall.common.to.mq.SeckillOrderTo cannot be cast to java.lang.String
3.雖然兩個切面都返回了 orderSn
,實際最終只有切面A傳遞到了控制層和前端, 切面B的返回值成了擺設(shè)。
跳轉(zhuǎn)過程
打斷點查看兩個切面的跳轉(zhuǎn)過程。
切面A:準(zhǔn)備跳轉(zhuǎn)第二個切面
切面B:發(fā)送消息完成
打印日志,可見場景需求,已經(jīng)滿足了。
2022-03-29 17:32:56.521 INFO 7904 --- [io-25000-exec-8] c.m.g.s.aspect.SeckillRabbitMqAspect : 快速創(chuàng)建訂單:發(fā)送消息創(chuàng)建完成: 202203291732444881508738921192005634 2022-03-29 17:33:01.526 INFO 7904 --- [io-25000-exec-8] c.m.g.s.controller.SeckillController : 秒殺創(chuàng)建訂單用時:28778 ?? seckill orderSn = 202203291732444881508738921192005634 2022-03-29 17:33:01.527 INFO 7904 --- [nectionFactory5] c.m.g.s.config.RabbitMqSeckillConfig : ?? 消息已發(fā)送, params: correlationData:null,ack:true,cause:null
其他方案
最簡單的辦法,不切了,兩個切面耦合在一起。注入和調(diào)用方法
到此這篇關(guān)于Spring AOPr如何打通兩個切面之間的通信的文章就介紹到這了,更多相關(guān)Spring AOP 切面通信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java基礎(chǔ)MAC系統(tǒng)下IDEA連接MYSQL數(shù)據(jù)庫JDBC過程
最近一直在學(xué)習(xí)web項目,當(dāng)然也會涉及與數(shù)據(jù)庫的連接這塊,這里就總結(jié)一下在IDEA中如何進(jìn)行MySQL數(shù)據(jù)庫的連接,這里提一下我的電腦是MAC系統(tǒng),使用的編碼軟件是IDEA,數(shù)據(jù)庫是MySQL2021-09-09Java環(huán)境中MyBatis與Spring或Spring MVC框架的集成方法
和MyBatis類似,Spring或者Spring MVC框架在Web應(yīng)用程序的運作中同樣主要負(fù)責(zé)處理數(shù)據(jù)庫事務(wù),這里我們就來看一下Java環(huán)境中MyBatis與Spring或Spring MVC框架的集成方法2016-06-06Spring Security Remember me使用及原理詳解
這篇文章主要介紹了Spring Security Remember me使用及原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09nacos客戶端一致性hash負(fù)載需求實現(xiàn)
這篇文章主要介紹了nacos客戶端一致性hash負(fù)載的需求實現(xiàn)過程及步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-02-02springboot如何解決非controller類引用service的問題
這篇文章主要介紹了springboot如何解決非controller類引用service的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02使用純Java實現(xiàn)一個WebSSH項目的示例代碼
這篇文章主要介紹了使用純Java實現(xiàn)一個WebSSH項目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03解決mybatis-generator生成Mapper文件沒有Selective結(jié)尾的問題
這篇文章主要介紹了解決mybatis-generator生成Mapper文件沒有Selective結(jié)尾的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09