Spring?AOPr如何打通兩個(gè)切面之間的通信
場(chǎng)景描述
在秒殺微服務(wù)中,筆者在需要各種校驗(yàn)前端傳來(lái)的參數(shù)后,通過(guò) Redis 加鎖限流(切面A)并返回,最后封裝訂單數(shù)據(jù)推送到 RabbitMQ 消息隊(duì)列(切面B)做善后工作。
問題:如何將 切面 A 的數(shù)據(jù)傳遞 給切面B 處理呢?
/**
* 添加到秒殺流程
*
* @param killId 秒殺商品緩存鍵 sessionId_skuId
* @param key 隨機(jī)碼 randomCode
* @param num 數(shù)量
* @return {@link R}
*/
@GetMapping("/kill")
public R addToSeckill(
@RequestParam("killId") String killId,
@RequestParam("key") String key,
@RequestParam("num") Integer num) {
// 實(shí)現(xiàn)類只是帶有兩個(gè)注解方法,返回 null(因?yàn)槿拷唤o切面托管了)
String orderSn = seckillService.kill(killId, key, num);
if (StringUtils.isEmpty(orderSn)) {
return R.error();
}
return R.ok().setData(orderSn);
}
解決方案
通過(guò)參數(shù)傳遞數(shù)據(jù),通過(guò)捕獲異常保證業(yè)務(wù)邏輯(離譜但有用) ??
// 強(qiáng)制修改參數(shù),通過(guò)異常返回正常流程,而通過(guò)AOP消息隊(duì)列處理收尾動(dòng)作
try {
return pjp.proceed(new Object[]{orderTo, null, null});
} catch (Throwable e) {
return orderSn;
}
注意事項(xiàng):
參數(shù)一致性:必須偽造和方法簽名的數(shù)量相等的參數(shù) ⇒ 否則線程會(huì)拋出異常 I 就返回了,無(wú)法執(zhí)行
pjp.proceed原始方法 ⇒ 無(wú)法跳轉(zhuǎn)第二個(gè)切面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.雖然兩個(gè)切面都返回了 orderSn ,實(shí)際最終只有切面A傳遞到了控制層和前端, 切面B的返回值成了擺設(shè)。
跳轉(zhuǎn)過(guò)程
打斷點(diǎn)查看兩個(gè)切面的跳轉(zhuǎn)過(guò)程。
切面A:準(zhǔn)備跳轉(zhuǎn)第二個(gè)切面

切面B:發(fā)送消息完成

打印日志,可見場(chǎng)景需求,已經(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)建訂單用時(shí):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
其他方案
最簡(jiǎn)單的辦法,不切了,兩個(gè)切面耦合在一起。注入和調(diào)用方法
到此這篇關(guān)于Spring AOPr如何打通兩個(gè)切面之間的通信的文章就介紹到這了,更多相關(guān)Spring AOP 切面通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis foreach用法解析--對(duì)于list和array
這篇文章主要介紹了Mybatis foreach用法解析--對(duì)于list和array,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringBoot如何獲取Get請(qǐng)求參數(shù)詳解
SpringBoot為我們封裝了許多簡(jiǎn)便的獲取請(qǐng)求參數(shù)的方法,下面這篇文章主要給大家介紹了關(guān)于SpringBoot如何獲取Get請(qǐng)求參數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
Spring AI內(nèi)置DeepSeek的詳細(xì)步驟
Spring AI 最新快照版已經(jīng)內(nèi)置 DeepSeek 了,所以以后項(xiàng)目中對(duì)接 DeepSeek 就方便多了,但因?yàn)榭煺瞻鏁?huì)有很多 Bug,所以今天咱們就來(lái)看穩(wěn)定版的 Spring AI 如何對(duì)接 DeepSeek 滿血版,感興趣的小伙伴跟著小編一起來(lái)看看吧2025-02-02
idea項(xiàng)目啟動(dòng)報(bào)錯(cuò),日志包沖突slf4j和logback沖突問題
遇到SLF4J沖突時(shí),可以嘗試移除沖突的綁定或調(diào)整項(xiàng)目依賴,具體方法包括刪除多余的Logger綁定庫(kù),如Logback或Log4j,或在項(xiàng)目配置文件中明確指定使用的日志框架,若使用WebLogic服務(wù)器,需在weblogic.xml中進(jìn)行特定配置,適當(dāng)調(diào)整pom.xml文件中的依賴版本也可能解決問題2024-09-09
工廠模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了工廠模式_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下2017-08-08
java實(shí)現(xiàn)ModbusCRC16校驗(yàn)的示例代碼
本文介紹了使用Java實(shí)現(xiàn)ModbusCRC16校驗(yàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11
將java項(xiàng)目打包成exe可執(zhí)行文件的完整步驟
最近項(xiàng)目要求,需要將java項(xiàng)目生成exe文件,下面這篇文章主要給大家介紹了關(guān)于如何將java項(xiàng)目打包成exe可執(zhí)行文件的相關(guān)資料,文章通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06

