SpringのRestTemplate
を使用する場合のデフォルトのタイムアウト値は何ですか?
たとえば、次のようなWebサービスを呼び出しています。
RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class);
RestTemplate
に組み込みのタイムアウト値はありますか?タイムアウト値を変更する予定はありませんが、すべてのリクエストに適切なタイムアウトが設定されるようにします。
タイムアウトパラメータにSimpleClientHttpRequestFactoryを使用できると思います。 SimpleClientHttpRequestFactoryのインスタンスは、コンストラクターまたはセッターメソッドによってRESTテンプレートに設定できます。
デフォルトでは、RestTemplateはSimpleClientHttpRequestFactoryを使用するため、値をrestTemplateに直接設定できる場合があります。
質問に明示的に回答するには...
デフォルトのタイムアウトは無限です。
デフォルトでは、RestTemplateはSimpleClientHttpRequestFactoryを使用し、次にHttpURLConnectionを使用します。
デフォルトでは、HttpURLConnectionのタイムアウトは0です。つまり、これらのプロパティで設定されていない限り、無限です。
-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec
Spring-Android RestTemplateの素晴らしい機能の1つは、OSのバージョンに応じたRequestFactoryの適切な(Googleが推奨する)実装の使用です。
Gingerbread(バージョン2.3)以降ではJ2SE機能を使用することをお勧めしますが、以前のバージョンではHttpComponents HttpClientを使用する必要があります。この推奨事項に基づいて、RestTemplateは、アプリが実行されているAndroidのバージョンをチェックし、適切なClientHttpRequestFactoryを使用します。
したがって、HttpComponentsClientHttpRequestFactory(Android OSバージョン<2.3)でspring-Androidによって使用される)は考慮されないため、前の答えは完全ではありません。
私の解決策は次のようなものでした:
public class MyRestTemplate extends RestTemplate {
public MyRestTemplate() {
if (getRequestFactory() instanceof SimpleClientHttpRequestFactory) {
Log.d("HTTP", "HttpUrlConnection is used");
((SimpleClientHttpRequestFactory) getRequestFactory()).setConnectTimeout(10 * 1000);
((SimpleClientHttpRequestFactory) getRequestFactory()).setReadTimeout(10 * 1000);
} else if (getRequestFactory() instanceof HttpComponentsClientHttpRequestFactory) {
Log.d("HTTP", "HttpClient is used");
((HttpComponentsClientHttpRequestFactory) getRequestFactory()).setReadTimeout(10 * 1000);
((HttpComponentsClientHttpRequestFactory) getRequestFactory()).setConnectTimeout(10 * 1000);
}
}
}
RestTemplateコンストラクターでClientHttpRequestFactoryパラメーターを使用できます。
private final int HTTP_CONNECT_TIMEOUT = 15000;
private final int HTTP_READ_TIMEOUT = 10000;
private ClientHttpRequestFactory getClientHttpRequestFactory() {
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
clientHttpRequestFactory.setConnectTimeout(HTTP_CONNECT_TIMEOUT);
clientHttpRequestFactory.setReadTimeout(HTTP_READ_TIMEOUT);
return clientHttpRequestFactory;
}
新しいRestTemplateが必要な場合は、次の例のように作成します。
RestTemplate rt = new RestTemplate(getClientHttpRequestFactory());