返回顶部
首页 > 资讯 > 后端开发 > Python >Spring AOPr如何打通两个切面之间的通信
  • 702
分享到

Spring AOPr如何打通两个切面之间的通信

2024-04-02 19:04:59 702人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录场景描述解决方案跳转过程其他方案场景描述 在秒杀微服务中,笔者在需要各种校验前端传来的参数后,通过 Redis 加锁限流(切面A)并返回,最后封装订单数据推送到 RabbitMQ

场景描述

在秒杀微服务中,笔者在需要各种校验前端传来的参数后,通过 Redis限流(切面A)并返回,最后封装订单数据推送到 RabbitMQ 消息队列(切面B)做善后工作。

问题:如何将 切面 A 的数据传递 给切面B 处理呢?


@GetMapping("/kill")
public R addToSeckill(
        @RequestParam("killId") String killId,
        @RequestParam("key") String key,
        @RequestParam("num") Integer num) {
    // 实现类只是带有两个注解方法,返回 null(因为全部交给切面托管了)
    String orderSn = seckillService.kill(killId, key, num);
    if (StringUtils.isEmpty(orderSn)) {
        return R.error();
    }
    return R.ok().setData(orderSn);
}

解决方案

通过参数传递数据,通过捕获异常保证业务逻辑(离谱但有用) ?

// 强制修改参数,通过异常返回正常流程,而通过aop消息队列处理收尾动作
try {
    return pjp.proceed(new Object[]{orderTo, null, null});
} catch (Throwable e) {
    return orderSn;
}

注意事项:

  • 参数一致性:必须伪造和方法签名的数量相等的参数 ⇒ 否则线程会抛出异常 I 就返回了,无法执行 pjp.proceed 原始方法 ⇒ 无法跳转第二个切面
    java.lang.IllegalArgumentException: Expecting 3 arguments to proceed, but was passed 1 arguments

  • 捕获异常不抛出,直接执行正常业务逻辑 ⇒ 否则线程将吞没异常 II
    cn.miozus.gulimall.common.to.MQ.SeckillOrderTo cannot be cast to java.lang.String

3.虽然两个切面都返回了 orderSn ,实际最终只有切面A传递到了控制层和前端, 切面B的返回值成了摆设。

跳转过程

打断点查看两个切面的跳转过程。

切面A:准备跳转第二个切面

切面B:发送消息完成

打印日志,可见场景需求,已经满足了。

2022-03-29 17:32:56.521 INFO 7904 --- [io-25000-exec-8] c.m.g.s.aspect.SeckillRabbitMqAspect : 快速创建订单:发送消息创建完成: 202203291732444881508738921192005634 2022-03-29 17:33:01.526 INFO 7904 --- [io-25000-exec-8] c.m.g.s.controller.SeckillController : 秒杀创建订单用时:28778 ? seckill orderSn = 202203291732444881508738921192005634 2022-03-29 17:33:01.527 INFO 7904 --- [nectionFactory5] c.m.g.s.config.RabbitMqSeckillConfig : ? 消息已发送, params: correlationData:null,ack:true,cause:null

其他方案

最简单的办法,不切了,两个切面耦合在一起。注入和调用方法

到此这篇关于spring AOPr如何打通两个切面之间的通信的文章就介绍到这了,更多相关Spring AOP  切面通信内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Spring AOPr如何打通两个切面之间的通信

本文链接: https://lsjlt.com/news/144369.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring AOPr如何打通两个切面之间的通信
    目录场景描述解决方案跳转过程其他方案场景描述 在秒杀微服务中,笔者在需要各种校验前端传来的参数后,通过 Redis 加锁限流(切面A)并返回,最后封装订单数据推送到 RabbitMQ...
    99+
    2024-04-02
  • c语言两个线程之间怎么通信
    在C语言中,可以使用以下方法实现两个线程之间的通信:1. 全局变量:两个线程可以共享一个全局变量,并通过对该变量的读写来进行通信。需...
    99+
    2023-10-12
    c语言
  • 两个Node.js进程间是如何进行通信的
    这篇文章主要讲解了“两个Node.js进程间是如何进行通信的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“两个Node.js进程间是如何进行通信的”吧!两个...
    99+
    2024-04-02
  • 如何利用js在两个html窗口间通信
    场景:当A页面打开B页面,在B页面操作后,A页面需要同步变更数据时 A 页面 ,http://127.0.0.1:10001/A.html var domain = 'http:...
    99+
    2024-04-02
  • liferay与portlet之间如何通信
    这篇文章主要介绍了liferay与portlet之间如何通信,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、通过URL传值这个是我在项目中***次遇到这样的问题,找出的一个...
    99+
    2023-06-17
  • Angular中组件之间如何通信
    本文小编为大家详细介绍“Angular中组件之间如何通信”,内容详细,步骤清晰,细节处理妥当,希望这篇“Angular中组件之间如何通信”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识...
    99+
    2024-04-02
  • 如何实现React组件之间的通信
    这篇文章主要为大家展示了“如何实现React组件之间的通信”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何实现React组件之间的通信”这篇文章吧。1.定义两...
    99+
    2024-04-02
  • 详解两个Node.js进程是如何通信
    目录前言不同电脑上的两个 Node.js 进程间通信 使用 TCP 套接字 使用 HTTP 协议 同一台电脑上两个 Node.js 进程间通信 使用内置 IPC 通道 使用自定义管道...
    99+
    2024-04-02
  • 计算机之间如何实现通信
    这篇文章给大家介绍计算机之间如何实现通信,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。在计算机网络中,计算机之间的通信是通过网络协议实现的。什么是网络协议?网络协议是为计算机网络中进行数据交换而建立的规则、标准或约定的...
    99+
    2023-06-14
  • Qt如何实现两个独立窗口的信号通信
    小编给大家分享一下Qt如何实现两个独立窗口的信号通信,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体内容如下知识点Qt两个窗口的建立、窗口的通信、处理子窗口的信号、信号的重载、Lamber表达式、自定义信号和自定义槽函数...
    99+
    2023-06-22
  • 实现页面之间通信的方法教程
    这篇文章主要介绍“实现页面之间通信的方法教程”,在日常操作中,相信很多人在实现页面之间通信的方法教程问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”实现页面之间通信的方法教程”...
    99+
    2024-04-02
  • C++中父子进程之间如何通信
    在C++中,父进程和子进程之间可以通过管道、共享内存、信号量、消息队列等方式进行通信。下面分别介绍这些通信方式: 管道(Pipe...
    99+
    2024-04-02
  • WindowsServer2019Ipsec安全策略(实现两机之间的安全通信)
    本地安全策略 本地安全策略,是指对登陆到计算机上的账号定义一些安全设置,在没有活动目录集中管理的情况下,本地管理员必须为计算机进行设置以确保其安全。 IP安全策略 IP安全策略是一个...
    99+
    2023-05-18
    win2019 Ipsec 安全策略
  • SpringCloud如何解决服务之间的通信问题
    目录1、如何解决服务之间的通信问题?2、如何在java代码中发起http方式请求?3、实现服务间通信的小案例4、现有RestTemplate方式通信存在的问题?5、解决RestTem...
    99+
    2024-04-02
  • 如何利用Storage Event实现页面间通信
    这篇文章主要介绍了如何利用Storage Event实现页面间通信,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。我们都知道触发window.onstorage必须满足以下两个...
    99+
    2023-06-09
  • 如何在 Go 中使用 MPMC 通道在 Goroutine 之间高效通信?
    在 go 中使用 mpmc 通道可以高效地实现 goroutine 之间的通信,其主要步骤如下:调用 make 函数创建 mpmc 通道:ch := make(chan int, buf...
    99+
    2024-05-15
    mpmc
  • Java中线程之间的通信是如何实现的
    这篇文章将为大家详细讲解有关Java中线程之间的通信是如何实现的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程...
    99+
    2023-05-31
    java 线程 通信
  • winform使用委托和事件来完成两个窗体之间通信的实例
    单击按钮 复制代码 代码如下:/// <summary>    /// Form1    /// <...
    99+
    2022-11-15
    委托 事件 通信
  • kubernetes如何实现集群各模块之间的通信
    这篇文章主要为大家展示了“kubernetes如何实现集群各模块之间的通信”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“kubernetes如何实现集群各模块之间的通信”这篇文章吧。一: 通信结...
    99+
    2023-06-04
  • spring切面如何使用传递给被通知方法的参数
    小编给大家分享一下spring切面如何使用传递给被通知方法的参数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:场景:BlankDisc代表CD实体,可以...
    99+
    2023-05-30
    spring
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作