title: 幂等性的注解使用
tags: 新建,模板,小书匠
grammar_cjkRuby: true
* [应用背景](#应用背景)
* [代码的实现dome](#代码的实现dome)
* [项目代码地址](#项目代码地址)
* [注解的使用](#注解的使用)
* [redis API 拓展](#redis-api-拓展)
* [AOP 失效的原因](#aop-失效的原因)
应用背景
项目使用spring boot + spring cloud分布式的服务框架,分布式在高并发的情况下很容易造成同一个请求在不同服务中执行,并且产生脏数据.所以需要实现接口的幂等性,以此来避免上述情况的出现.
代码的实现dome
项目代码地址
base 项目下 base-util: com.maxx.base.util.idempotent包下
具体代码目录:
.
├── IdempotentAspect.java //aop逻辑
├── IdempotentException.java //自定义异常(未使用)
├── Idempotent.java //自定义注解
└── IdempotentKeyUtil.java //工具类
二次开发则基本遵循上述代码逻辑—使用环绕通知来对接口参数返回参数进行控制.代码中皆有注释.
注解的使用
注解直接标注在需要拦截的方法上
//注解自定义redis的key的一部分,针对业务的key值
String key();
//过期时间redis中key的存活时间
long expirMillis() default 10L;
//返回指定类,违反幂等性后返回参数---可以用自定义异常进行处理
Class clazz() default void.class;
//返回的类型是否为引用类型
boolean isQuoteTypes() default true;
//返回的类型是基本类型的默认值(默认String为基本类型)
String BasicValue() default "";
redis API 拓展
JedisCommands接口的分析
参数解释如下:
nxxx的值只能取NX或者XX,如果取NX,则只有当key不存在是才进行set,如果取XX,只有当key已经存在时才进行set
expx expx的值只能取EX或者PX,代表数据过期时间的单位,EX代表秒,PX代表毫秒
key value nxxx(set规则) expx(取值规则) time(过期时间)
AOP 失效的原因
在项目中使用AOP的过程中有时候会出现无法拦截方法的问题.这个因为方法内调用方法的原因.如下就有可能造成aop失效的问题
p m1() {
m2()
}
@aop
p m2 (){}
解决方案有二
一. 避免方法内调用.
二. 看这里