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; } }