当前位置:   article > 正文

避免重复提交解决方案之一_elasticsearch如何避免重复提交

elasticsearch如何避免重复提交

一、定义一个注解用于标注需要校验重复提交的方法

  1. package com.xwolf.boot.annotation;
  2. import java.lang.annotation.*;
  3. /**
  4. * 避免重复提交
  5. * @author xwolf
  6. * @version 1.0
  7. * @since 1.8
  8. */
  9. @Target(ElementType.METHOD)
  10. @Retention(RetentionPolicy.RUNTIME)
  11. public @interface AvoidRepeatableCommit {
  12. /**
  13. * 指定时间内不可重复提交,单位毫秒
  14. * @return
  15. */
  16. long timeout() default 30000 ;
  17. }

二、添加一个切面用于校验来自同一IP地址的重复提交请求

  1. package com.xwolf.boot.aspect;
  2. import com.xwolf.boot.annotation.AvoidRepeatableCommit;
  3. import com.xwolf.boot.config.Constants;
  4. import com.xwolf.boot.utils.IPUtil;
  5. import com.xwolf.boot.utils.StringUtils;
  6. import com.xwolf.boot.utils.UUIDUtil;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.aspectj.lang.ProceedingJoinPoint;
  9. import org.aspectj.lang.annotation.Around;
  10. import org.aspectj.lang.annotation.Aspect;
  11. import org.aspectj.lang.reflect.MethodSignature;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.core.annotation.Order;
  14. import org.springframework.data.redis.core.RedisTemplate;
  15. import org.springframework.stereotype.Component;
  16. import org.springframework.web.context.request.RequestContextHolder;
  17. import org.springframework.web.context.request.ServletRequestAttributes;
  18. import javax.servlet.http.HttpServletRequest;
  19. import java.lang.reflect.Method;
  20. import java.util.concurrent.TimeUnit;
  21. /**
  22. * 重复提交aop
  23. * @author xwolf
  24. * @version 1.0
  25. * @since 1.8
  26. */
  27. @Order
  28. @Aspect
  29. @Component
  30. @Slf4j
  31. public class AvoidRepeatableCommitAspect {
  32. @Autowired
  33. private RedisTemplate redisTemplate;
  34. /**
  35. * @param point
  36. */
  37. @Around("@annotation(com.xwolf.boot.annotation.AvoidRepeatableCommit)")
  38. public Object around(ProceedingJoinPoint point) throws Throwable {
  39. HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();
  40. String ip = IPUtil.getIP(request);
  41. //获取注解
  42. MethodSignature signature = (MethodSignature) point.getSignature();
  43. Method method = signature.getMethod();
  44. //目标类、方法
  45. String className = method.getDeclaringClass().getName();
  46. String name = method.getName();
  47. String ipKey = String.format("%s#%s",className,name);
  48. int hashCode = Math.abs(ipKey.hashCode());
  49. String key = String.format("%s_%d",ip,hashCode);
  50. log.info("ipKey={},hashCode={},key={}",ipKey,hashCode,key);
  51. AvoidRepeatableCommit avoidRepeatableCommit = method.getAnnotation(AvoidRepeatableCommit.class);
  52. long timeout = avoidRepeatableCommit.timeout();
  53. if (timeout < 0){
  54. timeout = Constants.AVOID_REPEATABLE_TIMEOUT;
  55. }
  56. String value = (String) redisTemplate.opsForValue().get(key);
  57. if (StringUtils.isNotBlank(value)){
  58. return "请勿重复提交";
  59. }
  60. redisTemplate.opsForValue().set(key, UUIDUtil.uuid(),timeout,TimeUnit.MILLISECONDS);
  61. //执行方法
  62. Object object = point.proceed();
  63. return object;
  64. }
  65. }

三、对需要检验重复提交的方法添加注解

  1. /**
  2. * 添加用户
  3. * @param user
  4. * @return
  5. */
  6. @PostMapping(value = "add")
  7. @AvoidRepeatableCommit(timeout = 50000)
  8. public String insert(@Valid User user){
  9. // user.setBirth(new Date());
  10. log.info("请求参数:{}",user);
  11. return userService.insert(user);
  12. }


方案出自:https://github.com/fkandy/boot/tree/master/src/main/java/com/xwolf/boot

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/234593
推荐阅读
相关标签
  

闽ICP备14008679号