springboot +restTemplate配置
需要引入的依赖
# okhttp客户端
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
RestTempalteConfig配置类
下面展示一些 内联代码片
。
package com.zhouzhou.springredistemplatedemo.controller;
import okhttp3.ConnectionPool;
import okhttp3.OkHttpClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.OkHttp3ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.util.concurrent.TimeUnit;
@Configuration
public class RestTempalteConfig {
// 简单客户端配置
@Bean
public RestTemplate restTemplate1(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setConnectTimeout(5000);
factory.setReadTimeout(5000);
RestTemplate restTemplate = new RestTemplate(factory);
return restTemplate;
}
// 利用 okhttpclient 配置 (核心)
@Bean
public RestTemplate restTemplate2(OkHttpClient okHttpClient){
OkHttp3ClientHttpRequestFactory factory =new OkHttp3ClientHttpRequestFactory(okHttpClient);
return new RestTemplate(factory);
}
@Bean
public OkHttpClient okHttpClient(){
return new OkHttpClient().newBuilder()
.retryOnConnectionFailure(false) //连接失败是否重试
.connectionPool(new ConnectionPool(4,5, TimeUnit.MINUTES))// 连接池配置
.connectTimeout(5,TimeUnit.SECONDS)//连接超时时间
.readTimeout(10,TimeUnit.SECONDS)// 读取超时时间
.writeTimeout(10,TimeUnit.SECONDS)//写超时时间
.addInterceptor(new MyOkHttpClientIntercetor(2,1000)) // 增加过滤器,可以实现过一段时间重试的功能
.build();
}
}
MyOkHttpClientIntercetor 配置类
package com.zhouzhou.springredistemplatedemo.controller;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
@Slf4j
public class MyOkHttpClientIntercetor implements Interceptor {
// 重试次数
private int executionCount;
// 每次重试间隔的时间
private long retryInterval;
public MyOkHttpClientIntercetor(int executionCount, long retryInterval) {
this.executionCount = executionCount;
this.retryInterval = retryInterval;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = dorequest(chain, request);
int retryNum = 0;
while ((response == null || !response.isSuccessful()) && retryNum < executionCount) {
log.info("okhttpclient retry ,request=[{}],response=[{}]", request, response);
final long nextInterval = retryInterval;
try {
log.info("okhttpclient retry, wait for {}ms", nextInterval);
TimeUnit.MILLISECONDS.sleep(retryInterval);
} catch (InterruptedException e) {
e.printStackTrace();
}
retryNum++;
response = dorequest(chain, request);
}
return response;
}
public Response dorequest(Interceptor.Chain chain, Request request) {
Response response = null;
try {
response = chain.proceed(request);
} catch (IOException e) {
e.printStackTrace();
}
return response;
}
}