@Idempotent
注解IdempotentKeyResolver
即可
DefaultIdempotentKeyResolver.class
: 默认解析器,基于方法全量参数md5值实现ExpressionIdempotentKeyResolver.class
: 表达式解析器,支持SpEL或${spring.xxx}fallback
: 降级函数,支持当前bean和其他bean两种方式,支持原参数+IdempotentException
和原参数两种方式fallbackBean
: 降级函数所在的bean,默认为当前bean,支持其他bean //默认基于redis,如果应用配置多个StringRedisTemplate,需要配置redisTemplateName属性指定bean
//如果不想基于redis实现,可以不配置redisTemplateName属性
@EnableIdempotent(redisTemplateName = "stringRedisTemplate")
public class DemoApplication {
}
@Idempotent(key = "'GY:TEST:' + #user.name", timeout = 5, keyResolver = ExpressionIdempotentKeyResolver.class)
public void test(User user){
System.out.println("------------>>>>>>>>"+user);
}
IdempotentException
异常,可以针对此异常自定义返回信息,也可自定义降级函数fallback
,优先级高于异常处理
@ExceptionHandler(IdempotentException.class)
public ResponseEntity<Void> handleException(HttpServletRequest request, IdempotentException e) {
// 自定义异常处理
}
//场景一:降级fallback方法带原参数+IdempotentException public void fallbackMethod1(User user, IdempotentException e){ System.out.println(“fallback————»»»»“+user); }
//场景二:降级fallback方法带原参数,无IdempotentException public void fallbackMethod2(User user){ System.out.println(“fallback————»»»»“+user); }
- 降级函数在其他bean
```java
//降级函数fallback和fallbackBean定义示例
@Idempotent(key = "'GY:TEST:' + #user.name", timeout = 5, keyResolver = ExpressionIdempotentKeyResolver.class, fallback = "fallbackMethod3", fallbackBean = FallbackHandler.class)
public void test(User user){
System.out.println("------------>>>>>>>>"+user);
}
@Component
public class FallbackHandler {
//场景三:降级fallback方法带原参数+IdempotentException
public void fallbackMethod3(User user, IdempotentException e){
System.out.println("fallback------------>>>>>>>>"+user);
}
//场景四:降级fallback方法带原参数,无IdempotentException
public void fallbackMethod4(User user){
System.out.println("fallback------------>>>>>>>>"+user);
}
}