最近在跟第三方对接接口的时候发现,当第三方请求可以增加或者修改数据的接口时候,此时数据库会有重复数据,经过排查后发现是由于网路抖动的原因触发的,
发现问题后经过分析后的解决方案:一种是加乐观锁,二是redis分布式锁,但是考虑到涉及到的业务比较特殊,需要及时返回结果,保证下游业务的处理,
决定使用redis来进行控制,对于此次的处理进行记录。以下是相关的代码:
处理的方法
因为此次是处理是不能修改目前涉及到的业务,以及后续其他接口可以继续使用故选择AOP(面向切面)的实现方案;
Redisson配置
引入依赖文件
1 |
|
配置文件
Redisson 使用手册
根据Redisson官网的介绍,Redisson是架设在Redis基础上的一个Java驻内存数据网格,则Redisson可以使用Redis的基础配置,Redis的配置如图所示
客户端配置:RedissonClientConfig.java
1 |
|
自定义注解:ApiResubmit.java
1 |
|
AOP切面实现:ResubmitAspect.java
1 | /** |
以上就是防止重复提交的AOP方法,具体使用如图所示:
参数解析:
- prefix = “pacsStatus” 重复提交的前缀,用来区分不同的场景
- key = “#paramData.applyId” 重复提交的key,用来辨别是否是一次重复的请求
- forbidSeconds = 6, #请求禁止秒数,即在多少秒内禁止重复请求
- resultType = “0” #返回类型 0 为xml 1为 json
- limitResultType = LimitResultType.NAME_PACS #厂商返回类型
- message = “正在提交中,请稍后再试” #重复提交的提示信息
结束
以上就是防重复提交的方法,这只是其中解决方法的其中之一,但是在实际的业务中会存在缓存失效,锁的失效,要真正做到幂等性的话
还有根据自身的业务进行判断。