春のresttemplateタイムアウト設定について

About Spring Resttemplate Timeout Setting

  • Spring org.springframework.web.client.RestTemplateは、org.springframework.http.client.SimpleClientHttpRequestFactoryを使用してjava.net.HttpURLConnectionを確立します
  • 後者は、HttpURLConnectionのデフォルトのタイムアウト構成を使用します

HttpURLConnectionタイムアウトプロパティ

ConnectTimeout(ms)

  • このURLConnectionによって参照されるリソースへの通信リンクを開くときに使用される、ミリ秒単位の指定されたタイムアウト値。
  • 接続が確立される前にタイムアウトが期限切れになると、java.net.SocketTimeoutExceptionが発生します。ゼロのタイムアウトは、無限のタイムアウトとして解釈されます。
ReadTimeout(ms)

  • 指定されたタイムアウト(ミリ秒単位)。
  • ゼロ以外の値は、リソースへの接続が確立されたときに入力ストリームから読み取るときのタイムアウトを指定します。
  • 読み取り可能なデータが存在する前にタイムアウトが期限切れになると、java.net.SocketTimeoutExceptionが発生します。
  • ゼロのタイムアウトは無限のタイムアウトとして解釈されます

RestTemplateタイムアウト設定

コマンドライン引数(コードを変更せず、起動時に構成します)

  • HttpURLConnectionのデフォルト設定をオーバーライドします。
-Dsun.net.client.defaultConnectTimeout=> -Dsun.net.client.defaultReadTimeout=>
SimpleClientHttpRequestFactoryを使用してHttpURLConnectionを確立します

import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.http.client.SimpleClientHttpRequestFactory import org.springframework.web.client.RestTemplate import java.security.KeyManagementException import java.security.KeyStoreException import java.security.NoSuchAlgorithmException @Configuration public class RestTemplateConfiguration { @Bean public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { SimpleClientHttpRequestFactory clientHttpRequestFactory = new SimpleClientHttpRequestFactory() clientHttpRequestFactory.setConnectTimeout(10 * 1000) clientHttpRequestFactory.setReadTimeout(10 * 1000) return new RestTemplate(clientHttpRequestFactory) } }
HttpComponentsClientHttpRequestFactoryを使用してHttpURLConnectionを確立します(推奨)

  • org.springframework.http.client.HttpComponentsClientHttpRequestFactory
  • HttpComponentsClientHttpRequestFactoryのコンストラクターおよびセッターメソッドは、カスタム構成されたorg.apache.http.client.HttpClientをサポートします。
  • HttpClient構築クラスorg.apache.http.impl.client.HttpClientBuilder.setConnectionManager(pollingConnectionManager)メソッドを使用して接続プールを設定します
  • HttpClientBuilder.setDefaultRequestConfigはタイムアウトを設定します
  • HttpClientBuilder.setDefaultHeaders(headers)デフォルトのヘッダーを設定します
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.http.client.HttpComponentsClientHttpRequestFactory import org.springframework.web.client.RestTemplate import java.security.KeyManagementException import java.security.KeyStoreException import java.security.NoSuchAlgorithmException @Configuration public class RestTemplateConfiguration { @Bean public RestTemplate restTemplate() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory() httpRequestFactory.setConnectionRequestTimeout(30 * 1000) httpRequestFactory.setConnectTimeout(2 * 60 * 1000) httpRequestFactory.setReadTimeout(10 * 60 * 1000) return new RestTemplate(httpRequestFactory) } }