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

Spring?AOPr如何打通兩個切面之間的通信

 更新時間:2022年03月30日 08:18:41   作者:miozus  
本文主要介紹了Spring?AOPr如何打通兩個切面之間的通信,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

場景描述

在秒殺微服務(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:準備跳轉(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)文章

  • springboot如何關(guān)掉tomcat容器

    springboot如何關(guān)掉tomcat容器

    這篇文章主要介紹了springboot如何關(guān)掉tomcat容器,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Mybatis foreach用法解析--對于list和array

    Mybatis foreach用法解析--對于list和array

    這篇文章主要介紹了Mybatis foreach用法解析--對于list和array,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot如何獲取Get請求參數(shù)詳解

    SpringBoot如何獲取Get請求參數(shù)詳解

    SpringBoot為我們封裝了許多簡便的獲取請求參數(shù)的方法,下面這篇文章主要給大家介紹了關(guān)于SpringBoot如何獲取Get請求參數(shù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • Spring AI內(nèi)置DeepSeek的詳細步驟

    Spring AI內(nèi)置DeepSeek的詳細步驟

    Spring AI 最新快照版已經(jīng)內(nèi)置 DeepSeek 了,所以以后項目中對接 DeepSeek 就方便多了,但因為快照版會有很多 Bug,所以今天咱們就來看穩(wěn)定版的 Spring AI 如何對接 DeepSeek 滿血版,感興趣的小伙伴跟著小編一起來看看吧
    2025-02-02
  • idea項目啟動報錯,日志包沖突slf4j和logback沖突問題

    idea項目啟動報錯,日志包沖突slf4j和logback沖突問題

    遇到SLF4J沖突時,可以嘗試移除沖突的綁定或調(diào)整項目依賴,具體方法包括刪除多余的Logger綁定庫,如Logback或Log4j,或在項目配置文件中明確指定使用的日志框架,若使用WebLogic服務(wù)器,需在weblogic.xml中進行特定配置,適當調(diào)整pom.xml文件中的依賴版本也可能解決問題
    2024-09-09
  • 淺談java異常處理之空指針異常

    淺談java異常處理之空指針異常

    下面小編就為大家?guī)硪黄獪\談java異常處理之空指針異常。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • 工廠模式_動力節(jié)點Java學(xué)院整理

    工廠模式_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了工廠模式_動力節(jié)點Java學(xué)院整理的相關(guān)資料,需要的朋友可以參考下
    2017-08-08
  • java實現(xiàn)ModbusCRC16校驗的示例代碼

    java實現(xiàn)ModbusCRC16校驗的示例代碼

    本文介紹了使用Java實現(xiàn)ModbusCRC16校驗,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • 將java項目打包成exe可執(zhí)行文件的完整步驟

    將java項目打包成exe可執(zhí)行文件的完整步驟

    最近項目要求,需要將java項目生成exe文件,下面這篇文章主要給大家介紹了關(guān)于如何將java項目打包成exe可執(zhí)行文件的相關(guān)資料,文章通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • java多線程編程之使用Synchronized塊同步方法

    java多線程編程之使用Synchronized塊同步方法

    synchronized塊來同步一個對象變量,也可以使用synchronized塊來同步類中的靜態(tài)方法和非靜態(tài)方法,下面使用Synchronized塊同步方法
    2014-01-01

最新評論

南华县| 榆林市| 宁德市| 临潭县| 太谷县| 峨眉山市| 上犹县| 凉城县| 新和县| 云霄县| 萨迦县| 罗江县| 罗平县| 棋牌| 西乌| 辽阳市| 五寨县| 鄂托克前旗| 奉化市| 拉孜县| 封开县| 巫山县| 晴隆县| 静海县| 阳城县| 汪清县| 海淀区| 且末县| 河北区| 台山市| 克什克腾旗| 梁山县| 清河县| 扎赉特旗| 唐山市| 湄潭县| 保康县| 西城区| 韩城市| 深水埗区| 游戏|