使用场景:
spring-retry主要用于网络请求,当某一次网络请求失败时,能够重新进行尝试请求,解决某一时间的网络问题导致整个请求失败。
使用方法:
第一步:在pom.xml中添加坐标依赖
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
第二步:在要进行重试的方法上添加@Retryable注解
@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000L, multiplier = 1.5))
public List<Object> pullOrder(String orgId, String url, String beginDate, String endDate, String orderNo) throws Exception{
List<Object> list = new ArrayList<>();
Integer i = 1;
while (true) {
PageQueryCond pageQueryCond = PageQueryCond.builder().page(i).pageSize(50).build();
OpenApiOrderRequest openApiOrderRequest = OpenApiOrderRequest.builder().orgId(tmcUser + underline + orgId)
.gmtStartDate(beginDate).gmtEndDate(endDate).orderNo(orderNo)
.pageCond(pageQueryCond).build();
String data = DataTransferUtils.packageJSON(aesSeed, openApiOrderRequest);
EncryptSyncRequest encryptSyncRequest = EncryptSyncRequest.builder().accessToken(httpUtil.getToken())
.data(data).build();
String result = httpUtil.restTemplate(HttpMethod.POST, JSON.toJSONString(encryptSyncRequest), url);
ListResult response = JSON.parseObject(result, ListResult.class);
if (!response.getSuccess()) {
throw new RuntimeException("[OPENAPI_ORDER_SYNC] response error message: " + response.getErrorMessage());
}
if (CollectionUtils.isNotEmpty(response.getValues())) {
list.addAll(response.getValues());
}
if (response.getPageInfo().getPage().compareTo(response.getPageInfo().getPages()) >= 0) {
break;
}
i++;
}
return list;
}
注解参数解释:
@Retryable的参数说明:
* •value:抛出指定异常才会重试
* •include:和value一样,默认为空,当exclude也为空时, 默认所以异常
* •exclude:指定不处理的异常
* •maxAttempts:最大重试次数,默认3次
* •backoff:重试等待策略,默认使用@Backoff,@Backoff的value默认为1000L,我们设置为2000L;multiplier(指定延迟倍数)默认为0,表示固定暂停1秒后进行重试,如果把multiplier设置为1.5,则第一次重试为2秒,第二次为3秒,第三次为4.5秒。
第三步:在springBoot入口类添加@EnableRetry注解
@EnableRetry
至此,集成完毕。