diff --git a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/annotation/DLock.java b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/annotation/DLock.java index c141a85..58846a4 100644 --- a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/annotation/DLock.java +++ b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/annotation/DLock.java @@ -31,4 +31,9 @@ public @interface DLock { * @return 锁的时间单位 */ TimeUnit timeUnit() default TimeUnit.MILLISECONDS; + + /** + * @return 快速失败,true: 限流,拿不到锁,直接失败;false: 不限流,接收所有请求,阻塞执行 + */ + boolean fastFail() default false; } diff --git a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/aop/DistributedLockAspect.java b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/aop/DistributedLockAspect.java index 88af59f..39fd607 100644 --- a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/aop/DistributedLockAspect.java +++ b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/aop/DistributedLockAspect.java @@ -1,7 +1,8 @@ package com.xkcoding.distributed.lock.aop; import com.xkcoding.distributed.lock.annotation.DLock; -import com.xkcoding.distributed.lock.api.DistributedLockService; +import com.xkcoding.distributed.lock.api.DistributedLock; +import com.xkcoding.distributed.lock.api.DistributedLockClient; import lombok.RequiredArgsConstructor; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; @@ -27,24 +28,43 @@ import java.util.concurrent.TimeUnit; @Aspect @RequiredArgsConstructor public class DistributedLockAspect { - private final DistributedLockService distributedLockService; + private final DistributedLockClient distributedLockClient; - @Around("@annotation(lock)") - public Object around(ProceedingJoinPoint pjp, DLock lock) throws Throwable { + @Around("@annotation(dLock)") + public Object around(ProceedingJoinPoint pjp, DLock dLock) throws Throwable { Method method = ((MethodSignature) pjp.getSignature()).getMethod(); Object[] args = pjp.getArgs(); - String lockKey = lock.lockKey(); + String lockKey = dLock.lockKey(); lockKey = parseExpression(lockKey, method, args); - long timeout = lock.lockTime(); - TimeUnit timeUnit = lock.timeUnit(); - return distributedLockService.lock(lockKey, timeout, timeUnit, () -> { + long timeout = dLock.lockTime(); + TimeUnit timeUnit = dLock.timeUnit(); + + DistributedLock lock = distributedLockClient.getLock(lockKey, timeout, timeUnit); + + if (dLock.fastFail()) { + if (lock.tryLock()) { + try { + return pjp.proceed(); + } catch (Throwable t) { + throw new RuntimeException(t); + } finally { + lock.unlock(); + } + } else { + throw new RuntimeException("请勿重复提交!"); + } + } else { + lock.lock(); try { return pjp.proceed(); - } catch (Throwable e) { - throw new RuntimeException(e); + } catch (Throwable t) { + throw new RuntimeException(t); + } finally { + lock.unlock(); } - }); + } + } /** diff --git a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/DistributedLock.java b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/DistributedLock.java index 187598d..a93cbfa 100644 --- a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/DistributedLock.java +++ b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/DistributedLock.java @@ -16,15 +16,15 @@ public abstract class DistributedLock implements Lock { /** * 锁的标识 */ - private final String lockKey; + protected final String lockKey; /** * 锁的时间 */ - private final long lockTime; + protected final long lockTime; /** * 锁的时间单位 */ - private final TimeUnit timeUnit; + protected final TimeUnit timeUnit; protected DistributedLock(String lockKey, long lockTime, TimeUnit timeUnit) { this.lockKey = lockKey; diff --git a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/DistributedLockService.java b/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/DistributedLockService.java deleted file mode 100644 index 7b8c432..0000000 --- a/demo-distributed-lock/demo-distributed-lock-api/src/main/java/com/xkcoding/distributed/lock/api/DistributedLockService.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.xkcoding.distributed.lock.api; - -import java.util.concurrent.TimeUnit; -import java.util.function.Supplier; - -/** - *
- * 分布式锁实现 - *
- * - * @author yangkai.shen - * @date 2022-09-02 21:11 - */ -public interface DistributedLockService { - - /** - * 锁 - * - * @param lockKey 锁的标识 - * @param lockTime 锁的时间 - * @param timeUnit 锁的时间单位 - * @param execute 执行逻辑 - * @param- * 分布式锁实现 - *
- * - * @author yangkai.shen - * @date 2022-09-02 21:41 - */ -@Slf4j -@RequiredArgsConstructor -public class DistributedLockServiceImpl implements DistributedLockService { - private final DistributedLockClient distributedLockClient; - - /** - * 锁 - * - * @param lockKey 锁 - * @param timeout 超时时间 - * @param timeUnit 超时单位 - * @param execute 执行逻辑 - * @return 返回值 - */ - @Override - public