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

相关推荐
编啊编程啊程4 小时前
Netty从0到1系列之Selector
java·spring boot·spring cloud·java-ee·kafka·maven·nio
EQ-雪梨蛋花汤4 小时前
【代码里的英雄传】Dubbo 的一生:一位分布式勇士的传奇旅程
分布式·dubbo
angushine5 小时前
Spring Boot 工程启动时自动执行任务方法
java·spring boot·后端
冷雨夜中漫步6 小时前
ClickHouse常见问题——ClickHouseKeeper配置listen_host后不生效
java·数据库·clickhouse
野犬寒鸦7 小时前
力扣hot100:缺失的第一个正数(哈希思想)(41)
java·数据结构·后端·算法·leetcode·哈希算法
重生成为编程大王8 小时前
Java中使用JSONUtil处理JSON数据:从前端到后端的完美转换
java·后端·json
天若有情6738 小时前
《JAVA EE企业级应用开发》第一课笔记
java·笔记·后端·java-ee·javaee
豆沙沙包?9 小时前
2025年- H109-Lc1493. 删掉一个元素以后全为 1 的最长子数组(双指针)--Java版
java
Doris_LMS9 小时前
Git在idea中的实战使用经验(一)
java·git·gitlab·idea