38

Springを使用する場合のデフォルトのタイムアウト値は何RestTemplateですか?

たとえば、次のようなWebサービスを呼び出しています。

RestTemplate restTemplate = new RestTemplate();
String response = restTemplate.getForObject("http://webservice.com/item/3455", String.class);

組み込みのタイムアウト値はありRestTemplateますか?タイムアウト値を変更する予定はありませんが、すべてのリクエストに適切なタイムアウトがあることを確認したいと思います。

4

4 に答える 4

21

タイムアウト パラメータには SimpleClientHttpRequestFactory を使用できると思います。SimpleClientHttpRequestFactory のインスタンスは、コンストラクターまたはセッター メソッドによってレスト テンプレートに設定できます。

デフォルトでは、RestTemplate は SimpleClientHttpRequestFactory を使用するため、restTemplate に値を直接設定できる場合があります。

于 2012-07-18T09:14:20.777 に答える
12

spring-android RestTemplate の優れた機能の 1 つは、OS のバージョンに応じて RequestFactory の適切な (Google が推奨する) 実装を使用することです。

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);
        }
    }
}
于 2013-01-14T14:49:50.633 に答える