Flask接口签名sign原理与实例代码浅析
338
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~