幂等性的注解使用


title: 幂等性的注解使用
tags: 新建,模板,小书匠
grammar_cjkRuby: true

	* [应用背景](#应用背景)
	* [代码的实现dome](#代码的实现dome)
	* [项目代码地址](#项目代码地址)
	* [注解的使用](#注解的使用)
	* [redis API 拓展](#redis-api-拓展)
	* [AOP 失效的原因](#aop-失效的原因)

应用背景

	项目使用spring boot + spring cloud分布式的服务框架,分布式在高并发的情况下很容易造成同一个请求在不同服务中执行,并且产生脏数据.所以需要实现接口的幂等性,以此来避免上述情况的出现.

代码的实现dome

参考:Springboot幂等性的实现

项目代码地址

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 (){}

解决方案有二

一. 避免方法内调用.

二. 看这里

你可能感兴趣的:(幂等性的注解使用)