Le principe spécifique est très simple. Grâce à la notification surround de spring-aop, lorsque la requête démarre, le paramètre de la requête sera converti pour vérifier s'il existe déjà, une erreur sera signalée. sera stocké et supprimé une fois la demande terminée.
Le code spécifique est le suivant :
1. Annotation @interface
package com.yuntu.commons.intelligent.annotation;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * Created by niuzy on 2018-09-13. */@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface NotDuplicate {}
2. Aspects printaniers et notifications environnantes
import com.yuntu.commons.ServiceException;import com.yuntu.commons.intelligent.ExceptionConstants;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.aspectj.lang.reflect.MethodSignature;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Component;import java.lang.reflect.Method;import java.util.Set;import java.util.concurrent.ConcurrentSkipListSet;/** * Created by niuzy on 2018-09-13. */@Aspect@Componentpublic class NotDuplicateAop { private Logger LOG = LoggerFactory.getLogger(NotDuplicateAop.class); private static final Set<String> KEY = new ConcurrentSkipListSet<>(); @Pointcut("@annotation(com.yuntu.commons.intelligent.annotation.NotDuplicate)") public void duplicate() { } /** * 对方法拦截后进行参数验证 * @param pjp * @return * @throws Throwable */ @Around("duplicate()") public Object duplicate(ProceedingJoinPoint pjp) throws Throwable { MethodSignature msig = (MethodSignature) pjp.getSignature(); Method currentMethod = pjp.getTarget().getClass().getMethod(msig.getName(), msig.getParameterTypes()); //拼接签名 StringBuilder sb = new StringBuilder(currentMethod.toString()); Object[] args = pjp.getArgs(); for (Object object : args) { if(object != null){ sb.append(object.getClass().toString()); sb.append(object.toString()); } } String sign = sb.toString(); boolean success = KEY.add(sign); if(!success){ throw new ServiceException(ExceptionConstants.ILLEGAL_REQUEST_EXCEPTION,"该方法正在执行,不能重复请求"); } try { return pjp.proceed(); } finally { KEY.remove(sign); } } }
3. . Utilisez :
Ajouter @NotDuplicate sur les méthodes requises
.
Recommandations associées :
Exemple Spring d'intégration Mongodb
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!