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

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

直接再创建优惠券之前进行加锁。

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

首先定义一个注解

java 复制代码
/**
 * 防止用户重复提交表单信息切面控制器
 * <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();该语句是接着执行切点之后的逻辑,也就是创建优惠券。

相关推荐
潲爺9 小时前
Java IDEA学习之路:第二周课程笔记归纳
java·笔记·学习
遇见火星10 小时前
Rabbitmq 集群初始化,配置导入
分布式·rabbitmq·ruby
绝顶少年10 小时前
深入理解 RabbitMQ:消息处理全流程与核心能力解析
分布式·rabbitmq
haogexiaole10 小时前
es的java调用
java·elasticsearch·jenkins
在未来等你10 小时前
Kafka面试精讲 Day 20:集群监控与性能评估
大数据·分布式·面试·kafka·消息队列
开开心心就好10 小时前
PDF清晰度提升工具,让模糊文档变清晰
java·服务器·前端·python·智能手机·pdf·ocr
Chan1610 小时前
【 设计模式 | 创建型模式 建造者模式 】
java·spring boot·设计模式·java-ee·intellij-idea·建造者模式
汤姆yu11 小时前
2025版基于springboot的校内跑腿管理系统
java·spring boot·后端
孟意昶11 小时前
Spark专题-第二部分:Spark SQL 入门(2)-算子介绍-Scan/Filter/Project
大数据·hive·分布式·sql·spark
江上清风山间明月11 小时前
flutter 编译报错java.util.zip.ZipException: zip END header not found
java·开发语言·flutter