当前位置: 首页 > news >正文

【CouponHub开发记录】SpringAop和分布式锁进行自定义注解实现防止重复提交

当我们创建优惠券时,可能会出现由于网络延时等问题导致用户重复点击创建优惠券模板的操作。我们可以通过分布式锁,给当前线程进行加锁。如果获取锁失败说明重复提交。

在这里插入图片描述
直接再创建优惠券之前进行加锁。

但是这样直接写到业务当中导致代码比较繁琐,冗余。因此我们可以创建自定义注解,将该逻辑抽离出来。

在这里插入图片描述
首先定义一个注解

/*** 防止用户重复提交表单信息切面控制器* <p>* 作者:马丁* 加项目群:早加入就是优势!500人内部项目群,分享的知识总有你需要的 <a href="https://t.zsxq.com/cw7b9" />* 开发时间:2024-07-10*/
@Aspect
@RequiredArgsConstructor
public final class NoDuplicateSubmitAspect {private final RedissonClient redissonClient;/*** 增强方法标记 {@link NoDuplicateSubmit} 注解逻辑*/@Around("@annotation(com.nageoffer.onecoupon.framework.idempotent.NoDuplicateSubmit)")public Object noDuplicateSubmit(ProceedingJoinPoint joinPoint) throws Throwable {NoDuplicateSubmit noDuplicateSubmit = getNoDuplicateSubmitAnnotation(joinPoint);// 获取分布式锁标识String lockKey = String.format("no-duplicate-submit:path:%s:currentUserId:%s:md5:%s", getServletPath(), getCurrentUserId(), calcArgsMD5(joinPoint));RLock lock = redissonClient.getLock(lockKey);// 尝试获取锁,获取锁失败就意味着已经重复提交,直接抛出异常if (!lock.tryLock()) {throw new ClientException(noDuplicateSubmit.message());}Object result;try {// 执行标记了防重复提交注解的方法原逻辑result = joinPoint.proceed();} finally {lock.unlock();}return result;}

接着定义一个切面
其中在这里插入图片描述
该环绕通知会拦截所有带这个注解的方法
接着去执行获取分布式锁、然后执行相应逻辑
result = joinPoint.proceed();该语句是接着执行切点之后的逻辑,也就是创建优惠券。

http://www.dtcms.com/a/364362.html

相关文章:

  • RAG|| LangChain || LlamaIndex || RAGflow
  • kafka概念之间关系梳理
  • mac idea 配置了Gitlab的远程地址,但是每次pull 或者push 都要输入密码,怎么办
  • 项目中常用的git命令
  • python基础案例-数据可视化
  • Streamlit 数据看板模板:非前端选手快速搭建 Python 数据可视化交互看板的实用工具
  • 【Linux】为什么死循环卡不死 Linux?3 个核心逻辑看懂进程优先级与 CPU 调度密码
  • Langchain4j 整合MongoDB 实现会话持久化存储详解
  • 电表连网不用跑现场!耐达讯自动化RS485转Profinet网关 远程配置+技术支持,真能做到!
  • 单元测试数据库回滚问题
  • 如何在FastAPI中巧妙隔离依赖项,让单元测试不再头疼?
  • 10 分钟掌握 Selenium 8 大元素定位法:从踩坑到精通
  • Python分布式任务队列:万级节点集群的弹性调度实践
  • 深入剖析Spring Boot中Spring MVC的请求处理流程
  • 电脑接入企业中的网线,为啥网卡上面显示AD域名
  • 智能电视小米电视浏览器兼容性踩坑电视黑屏或者电视白屏,Vue项目从Axios到Fetch的避坑指南
  • 【Pytest】解决Pytest中Teardown钩子的TypeError:实例方法与类方法的调用差异
  • 腾讯Hunyuan-MT-7B翻译模型完全指南:2025年开源AI翻译的新标杆
  • 线性代数第一讲—向量组
  • 强化学习中的模仿学习是什么?
  • HR不会告诉你的秘密:学术简历中,这个内容会被秒标“高光“
  • 亚马逊云代理商:配置安全组规则步骤
  • 日志分析与安全数据上传脚本
  • 迅为RK3568开发板体验OpenHarmony—烧写镜像-安装驱动
  • 技术框架之脚手架实现
  • Trae x Vizro:低代码构建专业数据可视化仪表板的高效方案
  • HTML `<datalist>`:原生下拉搜索框,无需 JS 也能实现联想功能
  • kvm 虚拟机如何安装 qemu-guest-agent
  • C++ 面试高频考点 力扣 162. 寻找峰值 二分查找 题解 每日一题
  • C# Activator.GetObject 原理与示例:理解.NET Remoting远程调用