Skip to content

我已经检查了您提供的文件,发现这些文件已经有相对完整的注释了。不过为了进一步提升代码的可读性和可维护性,我会对其进行一些优化和完善。

RepeatExecuteLimitAutoConfiguration.java

RepeatExecuteLimitConstants.java

RepeatExecuteLimitLockInfoHandle.java

RepeatExecuteLimit.java

RepeatExecuteLimitConstant.java

RepeatExecuteLimitAspect.java

我已经为防重复执行/幂等控制框架添加了详细的中文注释,并总结了这些组件是如何协同工作的。

组件功能说明

1. RepeatExecuteLimitAutoConfiguration

防重复执行的自动配置类,负责注册相关的Bean到Spring容器中。

2. RepeatExecuteLimitConstants

定义系统中各种业务场景下的防重复执行标识常量。

3. RepeatExecuteLimitLockInfoHandle

防重复执行场景下的锁信息处理器实现类。

4. RepeatExecuteLimit

防重复执行注解,用于标记需要防重复执行的方法或类。

5. RepeatExecuteLimitConstant

防重复执行相关的常量定义。

6. RepeatExecuteLimitAspect

实现防重复执行和幂等性控制的核心切面类。

组件协同工作机制

1. 配置阶段

  • RepeatExecuteLimitAutoConfiguration自动配置类向Spring容器注册必要的Bean
  • 注册RepeatExecuteLimitLockInfoHandle作为防重复执行的锁信息处理器
  • 注册RepeatExecuteLimitAspect切面类处理防重复逻辑

2. 运行阶段

当带有@RepeatExecuteLimit注解的方法被调用时:

  1. 切面拦截:RepeatExecuteLimitAspect切面拦截方法调用
  2. 生成锁名:通过RepeatExecuteLimitLockInfoHandle生成唯一锁名称
  3. 本地锁保护:使用LocalLockCache获取ReentrantLock防止JVM内并发
  4. 分布式锁保护:通过ServiceLockFactory获取Redisson分布式锁防止多节点并发
  5. Redis标记位:使用RedissonDataHandle检查和设置Redis中的执行状态
  6. 执行业务:通过三层保护机制后执行目标方法
  7. 状态持久化:根据配置决定是否在Redis中设置执行标记

三层保护机制

  1. 本地锁(ReentrantLock)

    • 防止同一JVM内的并发执行
    • 快速失败,提高响应速度
  2. 分布式锁(Redisson)

    • 防止分布式环境下的并发执行
    • 确保全局互斥
  3. Redis标记位

    • 持久化记录执行状态
    • 确保幂等性

使用示例

java
// 1. 基本用法
@RepeatExecuteLimit(
    name = "create_order",
    keys = {"#order.id"}
)
public String createOrder(Order order) {
    // 业务逻辑
    return "success";
}

// 2. 带过期时间的用法
@RepeatExecuteLimit(
    name = "pay_order",
    keys = {"#orderId", "#userId"},
    durationTime = 60,  // 60秒内保持幂等
    message = "支付处理中,请勿重复提交"
)
public void payOrder(String orderId, String userId) {
    // 支付逻辑
}

// 3. 使用常量定义业务名称
@RepeatExecuteLimit(
    name = RepeatExecuteLimitConstants.CREATE_PROGRAM_ORDER,
    keys = {"#programId", "#userId"}
)
public void createProgramOrder(Long programId, Long userId) {
    // 创建节目订单逻辑
}

工作流程图

用户请求

@RepeatExecuteLimit注解标记的方法

RepeatExecuteLimitAspect切面拦截

生成唯一锁名称 ← RepeatExecuteLimitLockInfoHandle

检查Redis标记位 ← RedissonDataHandle

获取本地锁 ← LocalLockCache

获取分布式锁 ← ServiceLockFactory

双重检查Redis标记位

执行目标方法

设置Redis标记位(可选)

释放分布式锁

释放本地锁

返回结果

这套防重复执行框架通过本地锁、分布式锁和Redis标记位的三层保护机制,有效地解决了高并发场景下的重复提交和幂等性问题,确保系统的稳定性和数据一致性。