写一个aop ,分布式锁
-
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyLock { String name(); long waitTime() default 0; long leaseTime() default -1; TimeUnit timeUnit() default TimeUnit.SECONDS; } -
再写一个切面
@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(); } } -
然后在要被增强的方法上加上注解
@MyLock(name="test-redison-lock", leaseTime = 10,timeUnit = TimeUnit.SECONDS) - 补全具体切面
@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(); } } } }

浙公网安备 33010602011771号