【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();该语句是接着执行切点之后的逻辑,也就是创建优惠券。

相关推荐
谢亮_vipxieliang13 小时前
Spring Cloud 服务治理入门:注册发现、配置中心、网关限流、熔断降级与分布式一致性方案
分布式·spring·spring cloud
Wang's Blog14 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
\光辉岁月/15 小时前
5.java-数组
java·开发语言
谢亮_vipxieliang15 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
郑州光合科技余经理16 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
2601_9620715716 小时前
类变量和全局变量的生命周期有什么区别?
java·开发语言·jvm
code2cat16 小时前
Java进阶篇之AtomicReference:一次替换引用,读到一份完整状态
java·并发编程·不可变对象·atomicreference
专业程序开发源16 小时前
springboot简历管理系统81389-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·php·课程设计
Wang's Blog16 小时前
Java 项目实战: 外卖平台优化-前后端分离开发模式与工程拆分
java·开发语言
HEJOO917 小时前
指针的算术运算详解
java·数据结构·算法