写一个aop ,分布式锁

  1. 先定义一个注解

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.METHOD)
    public @interface MyLock {
        String name();
        long waitTime() default 0;
        long leaseTime() default -1;
        TimeUnit timeUnit() default TimeUnit.SECONDS;
    }
  2. 再写一个切面

    @Slf4j
    @Aspect
    @Component
    public class MyLockAspect {
        @Around("@annotation(lock)")
        public Object lock(ProceedingJoinPoint pjp, MyLock lock) throws Throwable{
            log.info(lock.name());
            return pjp.proceed();
        }
    }
  3. 然后在要被增强的方法上加上注解

    @MyLock(name="test-redison-lock", leaseTime = 10,timeUnit = TimeUnit.SECONDS)
  4. 补全具体切面
    @Slf4j
    @Aspect
    @Component
    public class MyLockAspect {
        @Autowired
        private RedissonClient redissonClient;
    
        @Around("@annotation(myLock)")
        public Object lock(ProceedingJoinPoint pjp, MyLock myLock) throws Throwable {
            log.info(myLock.name());
            RLock lock = redissonClient.getLock(myLock.name());
            boolean locked = false;
            try {
                locked = lock.tryLock(myLock.waitTime(), myLock.leaseTime(), myLock.timeUnit());
                if (!locked) {
                    //没有获取到锁
                    throw new RuntimeException();
                } else {
                    return pjp.proceed();
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                if (locked) {
                    lock.unlock();
                }
            }
        }
    }
posted @ 2024-07-25 10:55  冷风5997  阅读(16)  评论(0)    收藏  举报