restTemplate请求重发的相关设置-通过配置
通过配置的方式
相关的pom文件需要引入:httpclient
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
根据响应的HTTP状态码重试
在RestTemplate中有一个服务不可用重试配置,可以通过
httpClientBuilder.setServiceUnavailableRetryStrategy
来进行相关配置。通过查看源码可以发现,此处需要一个ServiceUnavailableRetryStrategy
的实现,该接口已有一个默认的DefaultServiceUnavailableRetryStrategy
配置。
默认的配置中,构造器代码如下:
public DefaultServiceUnavailableRetryStrategy(int maxRetries, int retryInterval) {
Args.positive(maxRetries, "Max retries");
Args.positive(retryInterval, "Retry interval");
this.maxRetries = maxRetries;
this.retryInterval = (long)retryInterval;
}
public DefaultServiceUnavailableRetryStrategy() {
this(1, 1000);
}
从默认的构造器源码中可以得到以下信息:
- 可以设置两个参数,一个是重试次数,一个是重试时间间隔。
- 默认的最大重试次数为1次,重试时间间隔为1s。
判断的相关代码如下:
public boolean retryRequest(HttpResponse response, int executionCount, HttpContext context) {
return executionCount <= this.maxRetries && response.getStatusLine().getStatusCode() == 503;
}
- 可以看出就是一个简单的判断,判断执行次数是否小于最大重试次数且返回的状态码是否为503.
如何定制自己需要的配置
- 次数和时间默认的配置已经给了构造方法。
- 如果想根据不同的状态则可以通过自己写一个类实现
ServiceUnavailableRetryStrategy
package com.doordiey.game.config;
import org.apache.http.HttpResponse;
import org.apache.http.client.ServiceUnavailableRetryStrategy;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.Args;
/**
* 根据返回的HTTP状态码决定是否要重试
*/
public class MyDefaultServiceUnavailableRetryStrategy implements ServiceUnavailableRetryStrategy {
private final int maxRetries;
private final long retryInterval;
public MyDefaultServiceUnavailableRetryStrategy(int maxRetries, int retryInterval) {
Args.positive(maxRetries, "Max retries");
Args.positive(retryInterval, "Retry interval");
this.maxRetries = maxRetries;
this.retryInterval = (long)retryInterval;
}
public MyDefaultServiceUnavailableRetryStrategy() {
this(1, 1000);
}
/**
* 修改此处的判断
* @param response
* @param executionCount
* @param context
* @return
*/
public boolean retryRequest(HttpResponse response, int executionCount, HttpContext context) {
return executionCount <= this.maxRetries