java 重复请求过滤(并发访问)
来源:互联网 发布:linux数据库备份命令 编辑:程序博客网 时间:2024/05/29 11:11
问题描述
前段时间遇到个问题,自己内部系统调用出现重复请求导致数据混乱。
发生条件:接受到一个请求,该请求没有执行完成又接受到相同请求,导致数据错误(如果是前一个请求执行完成,马上又接受相同请求不会有问题)
问题分析:是由于数据库的脏读导致
问题解决思路
1.加一把大大的锁 (是最简单的实现方式,但是性能堪忧,而且会阻塞请求)
2.实现请求拦截 (可以共用,但是怎么去实现却是一个问题,怎么用一个优雅的方式实现,并且方便复用)
3.修改实现 (会对原有代码做改动,存在风险,最主要的是不能共用)
最终实现方式第2中
通过注解+spring AOP 的方式实现
使用
通过在任意方法上添加注解NotDuplicate
类1:
import static java.lang.annotation.ElementType.METHOD;import java.lang.annotation.Documented;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;@Target({METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface NotDuplicate {}
类2:
import java.lang.reflect.Method;import java.util.Set;import java.util.concurrent.ConcurrentSkipListSet;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.springframework.stereotype.Component;@Aspect@Componentpublic class NotDuplicateAop { private static final Set<String> KEY = new ConcurrentSkipListSet<>(); @Pointcut("@annotation(com.hhly.skeleton.base.filter.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 ServiceRuntimeException("该方法正在执行,不能重复请求"); } try { return pjp.proceed(); } finally { KEY.remove(sign); } }}
阅读全文
0 0
- java 重复请求过滤(并发访问)
- 高并发重复请求的去重处理(转)
- spring boot 过滤请求并发送到controller
- JavaWeb过滤器,过滤请求防止强制访问
- 控制服务器处理请求的数量(高并发)-防止用户重复点击导致多次请求
- java模拟并发请求
- java访问https请求
- java访问https请求
- java防止请求重复提交
- Java Socket编程(四)重复和并发服务器
- Java Socket编程(四) 重复和并发服务器
- 过滤重复
- java模拟高并发请求
- 高并发重复请求的去重处理
- Java多线程并发访问解决方案
- Java多线程并发访问解决方案
- Java多线程并发访问解决方案
- java多线程并发访问解决方案
- Codeforces Round #431 (Div. 2) A. Odds and Ends
- Lintcode112 Remove Duplicates From Sorted List solution 题解
- printf内幕----编程内幕(1)
- springboot学习二(springboot相关配置)
- Bigtable: A Distributed Storage System for Structured Data : part6 Refinements
- java 重复请求过滤(并发访问)
- 假如时光倒流,我会这么学习Java
- Oracle 块头的事务槽
- 实数向整数的强制转换
- 位运算
- Linux进程概念
- vue 从零搭建项目
- hibernate(3)
- 1049. 数列的片段和(20)