All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gitee.fufu669.aspect.LockWithCacheAop Maven / Gradle / Ivy

There is a newer version: 6.666.66021
Show newest version
package com.gitee.fufu669.aspect;

import com.gitee.fufu669.common.CacheKeyCommon;
import com.gitee.fufu669.config.exception.CacheServerErrorCode;
import com.gitee.fufu669.config.exception.CacheServerException;
import com.gitee.fufu669.service.CacheService;
import com.gitee.fufu669.utils.CacheAopUtil;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.gitee.fufu669.utils.CacheRedisKeyUtil;

import java.lang.reflect.Method;

/**
 * @author wangfupeng on 2017-5-6.
 */
@Aspect
@Component
@SuppressWarnings("rawtypes")
/** @author wangfupeng */
public class LockWithCacheAop {

	public static final Logger logger = LoggerFactory.getLogger(LockWithCacheAop.class);

	@Autowired
	private CacheService cacheService;

	@Around("@annotation(com.gitee.fufu669.aspect.LockWithCache)")
	public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
		/* 获取注解里面的value*/
		String methodName = null;
		int expireSeconds = CacheKeyCommon.CACHESERVICE_REDIS_LOCK_DEFAULT_EXPIRED_SECONDS;
		try {
			String targetName = proceedingJoinPoint.getTarget().getClass().getName();
			methodName = proceedingJoinPoint.getSignature().getName();
			Class targetClass = Class.forName(targetName);
			Method[] methods = targetClass.getMethods();
			for (Method method : methods) {
				if (method.getName().equals(methodName)) {
					expireSeconds = method.getAnnotation(LockWithCache.class).expireSeconds();
					break;
				}
			}
		} catch (Exception e) {
			logger.info(e.toString());
		}
		/* 拦截的方法参数名*/
		Signature signature = proceedingJoinPoint.getSignature();
		MethodSignature methodSignature = (MethodSignature) signature;
		String lockKey = CacheRedisKeyUtil.getLockWithRedisAopLockKeyRedisKey(CacheAopUtil.getCacheKey(proceedingJoinPoint));
		if(cacheService.lock(lockKey,expireSeconds)) {
			try {
				Object object = proceedingJoinPoint.proceed();
				return object;
			} catch (Throwable e) {
				logger.info(e.getMessage(), e);
				throw e;
			}finally {
				cacheService.unlock(lockKey);
			}
		}else {
			throw new CacheServerException(CacheServerErrorCode.LOCKWITHREDIS_LOCK_FAILED);
		}
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy