springboot +restTemplate配置

2023年5月20日09:07:26

需要引入的依赖

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

  • 作者:zxl8899
  • 原文链接:https://blog.csdn.net/zxl8899/article/details/119481654
    更新时间:2023年5月20日09:07:26 ,共 2967 字。