SpringのRestit Tempalteクライアントが実現


RetsTemplateはsrpingパッケージのhttpクライアントであり、httpサービスとの通信方式を簡略化し、RESTfulの標準を統一している。
実装
実装タイプ
接続池
タイムアウト設定
デフォルト(HttpURLConnection)
N
Y
Appche Http Components
Y
Y
Netty
N
Y
OkHttp
Y
Y
HttpURLConnectionパラメータ
設定
説明
conn.setConnect Timeout(1000)
接続のタイムアウト時間をミリ秒単位で設定します。接続タイムアウトとは、TCP接続による握手が成功した時間を指します。http握手と接続を参照してください。
conn.set ReadTimeout(1000)
読み出しタイムアウト時間をミリ秒単位で設定します。サーバから一度にデータを読み込む時間です。httpを参考してタイムアウトしました
setsUseCaches(bollan)
キャッシュを使うかどうか
set DoOutput(boot)
パラメータを入力するかどうか
set DoInput(bolean)
パラメータを読み込むかどうか
注意:HttpURLConnectionにはデータ接続プールの機能がありません。各要求ごとに接続を確立します。
Rets Templateがタイムアウトを実現しました。
  • HttpURLConnectionに基づいてタイムアウトを実現しました。
    @Bean
      public RestTemplate getRestTemplate(){
      
        //default
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setReadTimeout(15000);//    
        requestFactory.setConnectTimeout(5000);//    
        RestTemplate restTemplate = new RestTemplate(requestFactory);
        return restTemplate;
      }
    
  • Apacheクライアントによるタイムアウトを実現する
  • @Bean
      public RestTemplate getRestTemplate(){
        //apache
        return new RestTemplate(getHttpCommonFactory());
      }
      @Bean
      public ClientHttpRequestFactory getHttpCommonFactory(){
        return new HttpComponentsClientHttpRequestFactory(httpClient());
      }
    @Bean
      public HttpClient httpClient() {
        Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", PlainConnectionSocketFactory.getSocketFactory())
            .register("https", SSLConnectionSocketFactory.getSocketFactory())
            .build();
        //     
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
        //#     
        connectionManager.setMaxTotal(200);
        //#   
        connectionManager.setDefaultMaxPerRoute(20);
        //connectionManager.setValidateAfterInactivity(httpPoolProperties.getValidateAfterInactivity());
        RequestConfig requestConfig = RequestConfig.custom()
            .setSocketTimeout(15000) //       (response)   ,    read timeout
            .setConnectTimeout(1000) //      (    )   ,    connect timeout
            //              ,          ,   org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
            .setConnectionRequestTimeout(30000)
            .build();
        return HttpClientBuilder.create()
            .setDefaultRequestConfig(requestConfig)
            .setConnectionManager(connectionManager)
            .build();
      }
    
  • nettyタイムアウト
  • を実現しました。
    キティ依存を導入:
        <dependency>
         <groupId>io.nettygroupId>
         <artifactId>netty-allartifactId>
         <version>4.1.36.Finalversion>
       dependency>
    
    初期化Rest Template
    @Bean
     public RestTemplate getRestTemplate(){
      //netty
       Netty4ClientHttpRequestFactory nettyFactory = new Netty4ClientHttpRequestFactory();
       nettyFactory.setReadTimeout(15000);
       nettyFactory.setConnectTimeout(5000);
       return new RestTemplate((ClientHttpRequestFactory)nettyFactory);
       
     }
    
    注意:nettyはNIOの実現フレームであり、接続数はオペレーティングシステムの制限を受け、クライアントのタイムアウトを処理する時、サービスエンドの処理接続数と合併(非nettyサービスエンド設定)に注意する。
  • Khttpクライアントタイムアウト
  • Khttp 3クライアント依存を導入する
        <dependency>
          <groupId>com.squareup.okhttp3groupId>
          <artifactId>okhttpartifactId>
          <version>3.14.1version>
        dependency>
    
    ok http 3を使ってRestTemplateを初期化します。
    @Bean
      public RestTemplate getRestTemplate(){
        //okhttp
        OkHttpClient client = new OkHttpClient.Builder()
            .readTimeout(15000,TimeUnit.MILLISECONDS)
            .connectTimeout(Duration.ofMillis(5000))
            .connectionPool(new ConnectionPool())
            .retryOnConnectionFailure(false)
            .build();
        OkHttp3ClientHttpRequestFactory okhttpFactory=new OkHttp3ClientHttpRequestFactory(client);
        return new RestTemplate((ClientHttpRequestFactory)okhttpFactory);
      }
    
    ここの接続池はConnection Pool、maxPool=2147483647です。static{exector=new ThreadPool Exector(0,2147483647,60 L,TimeUnit.SECONDS,new SyncronousQue(),Util.threadFactory(「OkHttp Connection Pool」,true);