十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
这篇文章主要介绍Java注解怎么基于redission实现分布式锁,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
10年积累的做网站、成都网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先制作网站后付款的网站建设流程,更有市中免费网站建设让你可以放心的选择与我们合作。
1、定义注解类
@Target({ ElementType.METHOD })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface DistributedLock { //锁名称 String lockName() default ""; //释放时间 long releaseTime() default 5*1000; //时间单位 TimeUnit timeUnit() default TimeUnit.MILLISECONDS;}
2、定义切面拦截 DistributedLock 注解
@Aspect@Component@Slf4jpublic 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 { 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; } } // 如果没有获取到业务编号,则使用方法签名 if (StringUtils.isEmpty(businessNo)) { businessNo = methodName; } } } return businessNo; }}
3、使用方法:在需要用分布式锁的方法上面加 @DistributedLock 注解即可
以上是“Java注解怎么基于Redission实现分布式锁”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注创新互联行业资讯频道!