1.什么是spring-retry
有些场景需要我们对一些异常情况下面的任务进行重试,比如:调用远程的RPC服务,可能由于网络抖动出现第一次调用失败,尝试几次就可以恢复正常。
spring-retry是spring提供的一个基于spring的重试框架,非常好用。
官网地址: 官网地址
2.添加依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
3.启动类增加@EnableRetry注解
@EnableDiscoveryClient
@SpringBootApplication
@EnableDistributedTransaction
@EnableAuthenticationClient
@MapperScan("com.***.mapper")
@EnableFeignClients({"com.***.api"})
@EnableScheduling
@EnableRetry //接口重试框架
public class AppletCenterApplication {
public static void main(String[] args) {
SpringApplication.run(AppletCenterApplication.class, args);
}
}
4.重试的接口上添加@Retryable注解
添加重试注解,当有异常时触发重试机制,设置重试5次,默认是3.延时2000ms再次执行,每次延时是上次延时的1.5倍.当返回结果不符合要求时,主动报错触发重试.
/**
* @description 获取录音文件下载地址
* 重试机制 5次 延时2000ms再次执行,每次延时是上次延时的1.5倍
* @params [recordDomain, fileName]
* @return java.lang.String
* @author xiaoyc
* @date 2021/5/8 16:41
**/
@Retryable(value = {BusinessException.class}, maxAttempts = 5,
backoff = @Backoff(delay = 2000, multiplier = 1.5))
public String axbGetRecordDownloadLink(String recordDomain, String fileName) {
log.info("*********获取录音文件下载地址开始*********{},{}" + recordDomain + fileName);
if (StringUtils.isBlank(recordDomain) || StringUtils.isBlank(fileName)) {
return "axbGetRecordDownloadLink set params error";
}
// 必填,AXB模式获取录音文件下载地址接口访问URI
String url = "/rest/provision/voice/record/v1.0";
String realUrl = buildOmpUrl(url);
// 申明对象
Map<String, Object> map = new HashMap<>();
// 录音文件存储的服务器域名
map.put("recordDomain", recordDomain);
// 录音文件名
map.put("fileName", fileName);
String result;
try {
result = HttpUtil.sendGet(OMPOMPAPPKEY, OMPAPPSECRET, realUrl, HttpUtil.map2UrlEncodeString(map));
HuaWeiSecretUtil.result(result);
} catch (Exception e) {
log.error("获取华为通话加密录音文件地址错误" + e.getMessage());
throw new BusinessException(e.getMessage());
}
log.info("*********获取录音文件下载地址结束*********{}" + result);
return result;
}
5.增加重试依然失败后回调的方法上加@Recover注解,如果不写,将正常的抛出异常
- 异常类型需要与Recover方法参数类型保持一致
- recover方法返回值需要与重试方法返回值保证一致