Java注解如何基于Redission实现分布式锁

网友投稿 311 2022-12-16


Java注解如何基于Redission实现分布式锁

这篇文章主要介绍了java注解如何基于Redission实现分布式锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、定义注解类

http://@Target({ ElementType.METHOD })

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface DistributedLock {

//锁名称

String lockName() default "";

//释放时间

long releaseTime() default 5*1000;

//时间单位

TimeUnit timeUnit() default TimeUnit.MILLISECONDS;

}

2、定义切面拦截 DistributedLock 注解

@Aspect

@Component

@Slf4j

public class DistributedLockAspect {

@Autowired

private RedissonClient redissonClient;

   //这里需要修改对应的包名

@Pointcut("@annotation(com.utils.annotation.DistributedLock)")

public void RlockAspect() {

}

@Around("RlockAspect()")

public Object arround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {

Object object = null;

RLock lock = null;

log.info("rlockAspect start ");

try {

JuhxpneBk DistributedLock rlockInfo = getRlockInfo(proceedingJoinPoint);

String lockKey = getLocalKey(proceedingJoinPoint, rlockInfo);

lock = redissonClient.getLock(lockKey);

if (lock != null) {

final boolean status = lock.tryLock(rlockInfo.releaseTime(), rlockInfo.timeUnit());

if (status) {

object = proceedingJoinPoint.proceed();

}

} else {

log.info("未获取到锁:{}", lockKey);

}

} finally {

// 当前线程获取到锁再释放锁

if (lock != null && lock.isHeldByCurrentThread()) {

lock.unlock();

}

}

return object;

}

public DistributedLock getRlockInfo(ProceedingJoinPoint proceedingJoinPoint) {

MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();

return methodSignature.getMethod().getAnnotation(DistributedLock.class);

}

/**

* 获取redis lock key

*

* @param proceedingJoinPoint

* @return

*/

public String getLocalKey(ProceedingJoinPoint proceedingJoinPoint, DistributedLock rlockInfo) {

StringBuilder localKey = new StringBuilder("Rlock");

final Object[] args = proceedingJoinPoint.getArgs();

String businessNo = "";

// 如果没有设置锁值

if (StringUtils.isNotEmpty(rlockInfo.lockName())) {

businessNo = rlockInfo.lockName();

} else {

MethodSignature methodSignature = (MethodSignature) proceedingJoinPoint.getSignature();

Class[] parameters = methodSignature.getParameterTypes();

String methodName = methodSignature.getMethod().getName();

if (parameters != null) {

for (int i = 0; i < parameters.length; i++) {

Class parameter = parameters[i];

if (parameter.getSimpleName().equals("NDevice")) {

NDevice de = (NDevice) args[i];

businessNo = de.getUuid() + methodName;

}

if (parameter.getSimpleName().equals("FrameBean")) {

FrameBean de = (FrameBean) args[i];

businessNo = de.getColumn1() + methodName;

}

}

http:// // 如果没有获取到业务编号,则使用方法签名

if (StringUtils.isEmpty(businessNo)) {

businessNo = methodName;

}

}

}

return businessNo;

}

}

3、使用方法:在需要用分布式锁的方法上面加 @DistributedLock 注解即可


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:通过java记录数据持续变化时间代码解析
下一篇:Spring StopWatch使用实例详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~