在最近的项目中访问第三方接口的时候,由于公司经费有限,密钥在获取的时候在环境上出现了冲突(即生产环境和测试环境共用一个app密钥,在获取请求密钥的时候生产环境和测试环境出现不断被对方刷新掉的情况)(一般情况下不会出现这种情况,会每一套环境都会有一个属于他自己的app密钥),这种情况下我们需要进行一个 刷新重试的机制(当某个环境上的密钥被刷新掉之后,再次访问的时候如果出现错误,进行一个刷新重试的机制),目前我了解到两种方式:
1>通过死循环的方式(切记这种方式一定要给出一个退出机制,否则你的程序将挂掉):比如你可以设置一个计数器,当他达到相应的次数之后就结束循环或者抛出异常之类的
2>通过spring自己集成的重试框架(spring-retry):
用法如下:通过注解@Retryable
@Retryable(value = {xxxException.class}, maxAttempts = 5)
其中value属性代表着在执行方法的过程中碰到那些异常需要重试(是一个集合),maxAttempts代表着最大的重试次数
特别注意的地方是:被@Retryable标注的方法不能通过内嵌的方式进行调用,所以最好专门定义一个类来写此方法
另外如果达到最大重试次数我们可以通过@Recover注解来修饰一个回调函数
@Recover
public 返回值类型 recover(xxxException e) {
log.error("由于达到重试次.......失败");
throw new xxxException("xxxxx");
}
注意的是该方法的返回值必须和@Retryable注解修饰的重试方法的返回值类型一致,否则将不能触发函数的回调,也有可能直接报错.
另外该回调函数的入参必须和@Retryable的value属性一致

被折叠的 条评论
为什么被折叠?



