/*
|
* Copyright (c) 2018-2999 广州市蓝海创新科技有限公司 All rights reserved.
|
*
|
* https://www.mall4j.com/
|
*
|
* 未经允许,不可做商业用途!
|
*
|
* 版权所有,侵权必究!
|
*/
|
|
package com.yami.trading.common.aspect;
|
|
import cn.hutool.core.util.StrUtil;
|
import com.yami.trading.common.annotation.RedisLock;
|
import com.yami.trading.common.util.SpelUtil;
|
import org.aspectj.lang.ProceedingJoinPoint;
|
import org.aspectj.lang.Signature;
|
import org.aspectj.lang.annotation.Around;
|
import org.aspectj.lang.annotation.Aspect;
|
import org.aspectj.lang.reflect.MethodSignature;
|
import org.redisson.api.RLock;
|
import org.redisson.api.RedissonClient;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import java.lang.reflect.Method;
|
|
/**
|
* @author lgh
|
*/
|
@Aspect
|
@Component
|
public class RedisLockAspect {
|
|
@Autowired
|
private RedissonClient redissonClient;
|
|
private static final String REDISSON_LOCK_PREFIX = "redisson_lock:";
|
|
@Around("@annotation(redisLock)")
|
public Object around(ProceedingJoinPoint joinPoint, RedisLock redisLock) throws Throwable {
|
String spel = redisLock.key();
|
String lockName = redisLock.lockName();
|
|
RLock rLock = redissonClient.getLock(getRedisKey(joinPoint,lockName,spel));
|
|
rLock.lock(redisLock.expire(),redisLock.timeUnit());
|
|
Object result = null;
|
try {
|
//执行方法
|
result = joinPoint.proceed();
|
|
} finally {
|
rLock.unlock();
|
}
|
return result;
|
}
|
|
/**
|
* 将spel表达式转换为字符串
|
* @param joinPoint 切点
|
* @return redisKey
|
*/
|
private String getRedisKey(ProceedingJoinPoint joinPoint,String lockName,String spel) {
|
Signature signature = joinPoint.getSignature();
|
MethodSignature methodSignature = (MethodSignature) signature;
|
Method targetMethod = methodSignature.getMethod();
|
Object target = joinPoint.getTarget();
|
Object[] arguments = joinPoint.getArgs();
|
return REDISSON_LOCK_PREFIX + lockName + StrUtil.COLON + SpelUtil.parse(target,spel, targetMethod, arguments);
|
}
|
}
|