当前位置 主页 > 服务器问题 > Linux/apache问题 >

    spring boot封装HttpClient的示例代码

    栏目:Linux/apache问题 时间:2019-10-20 22:03

    最近使用到了HttpClient,看了一下官方文档:HttpClient implementations are expected to be thread safe. It is recommended that the same instance of this class is reused for multiple request executions,翻译过来的意思就是:HttpClient的实现是线程安全的,可以重用相同的实例来执行多次请求。遇到这种描述的话,我们就应该想到,需要对HttpClient来进行封装了。由于是使用的spring boot,所以下面来结合spring boot来封装HttpClient。

    一、Request retry handler(请求重试处理)

    为了使自定义异常机制生效,需要实现HttpRequestRetryHandler接口,代码如下:

    import java.io.IOException; 
    import java.io.InterruptedIOException; 
    import java.net.UnknownHostException; 
    import javax.net.ssl.SSLException; 
    import javax.net.ssl.SSLHandshakeException; 
    import org.apache.http.HttpEntityEnclosingRequest; 
    import org.apache.http.HttpRequest; 
    import org.apache.http.NoHttpResponseException; 
    import org.apache.http.client.HttpRequestRetryHandler; 
    import org.apache.http.client.protocol.HttpClientContext; 
    import org.apache.http.conn.ConnectTimeoutException; 
    import org.apache.http.protocol.HttpContext; 
    import org.springframework.beans.factory.annotation.Value; 
    import org.springframework.context.annotation.Bean; 
    import org.springframework.context.annotation.Configuration; 
     
    /** 
     * 描述:HttpClient的重试处理机制 
     */ 
    @Configuration 
    public class MyhttpRequestRetryHandler { 
     
      @Value("${httpclient.config.retryTime}")// 此处建议采用@ConfigurationProperties(prefix="httpclient.config")方式,方便复用 
      private int retryTime; 
       
      @Bean 
      public HttpRequestRetryHandler httpRequestRetryHandler() { 
        // 请求重试 
        final int retryTime = this.retryTime; 
        return new HttpRequestRetryHandler() { 
          public boolean retryRequest(IOException exception, int executionCount, HttpContext context) { 
            // Do not retry if over max retry count,如果重试次数超过了retryTime,则不再重试请求 
            if (executionCount >= retryTime) { 
              return false; 
            } 
            // 服务端断掉客户端的连接异常 
            if (exception instanceof NoHttpResponseException) { 
              return true; 
            } 
            // time out 超时重试 
            if (exception instanceof InterruptedIOException) { 
              return true; 
            } 
            // Unknown host 
            if (exception instanceof UnknownHostException) { 
              return false; 
            } 
            // Connection refused 
            if (exception instanceof ConnectTimeoutException) { 
              return false; 
            } 
            // SSL handshake exception 
            if (exception instanceof SSLException) { 
              return false; 
            } 
            HttpClientContext clientContext = HttpClientContext.adapt(context); 
            HttpRequest request = clientContext.getRequest(); 
            if (!(request instanceof HttpEntityEnclosingRequest)) { 
              return true; 
            } 
            return false; 
          } 
        }; 
      } 
    } 
    

    二、Pooling connection manager(连接池管理)

    PoolingHttpClientConnectionManager用来管理客户端的连接池,并且可以为多个线程的请求提供服务,代码如下: