春の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) } }