2012-07-18 11 views
19

SpringのRestTemplateを使用するときのデフォルトのタイムアウト値はいくらですか?例えばのためにRestTemplate - デフォルトのタイムアウト値

、私はこのようなWebサービスを呼び出すいます:

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

RestTemplateための任意の組み込みのタイムアウト値はありますか?私はタイムアウト値を変更するつもりはないが、すべての要求に対して妥当なタイムアウトがあることを確認したい。

ありがとうございました。

答えて

16

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

デフォルトでは、RestTemplateはSimpleClientHttpRequestFactoryを使用しているため、値をrestTemplateに直接設定できます。

+1

感謝を。私はSimpleClientHttpRequestFactoryのドキュメントをチェックし、 "デフォルトのタイムアウトはシステムのデフォルトのタイムアウトです"と言います。どういう意味ですか ? –

+1

SimpleClientHttpRequestFactoryのソースコードを見てきました。デフォルト値は、読み取りと接続タイムアウトの両方で-1です。私はHTTPがURLConnectionに依存していることを意味するデフォルトを、デフォルトのタイムアウト設定のためにjdkに依存すると考えます。 –

+0

URLConnectionのデフォルトのタイムアウトは無限です。 RestTemplateにも無制限のタイムアウト値があることを意味しますか? –

12

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

は、Googleが以前のバージョンがHttpComponentsのHttpClientを使用する必要がありながら、ジンジャーブレッド(バージョン 2.3)以降にJ2SE施設を使用することを推奨しています。この推奨に基づいて、RestTemplateは、アプリが実行されている Androidのバージョンをチェックし、 の適切なClientHttpRequestFactoryを使用します。

HttpComponentsClientHttpRequestFactory(Android OSのバージョン< 2.3のために、ばねアンドロイドで使用されている)を考慮していないので、だから、前の回答は満杯ではありません。デフォルトのタイムアウトは無限である

...明示的に質問に答えるために

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); 
     } 
    } 
} 
+0

コードをありがとう!残りの通話にタイムアウトメッセージを設定するにはどうすればよいですか?リクエストがタイムアウトしても、サーバー側からのエラーがなく、メッセージが表示されないようにするために、 – DroidBee

+1

リクエストを実行するときに、SocketTimeoutExceptionまたは同様のものをキャッチし、タイムアウトメッセージを表示します。 – agamov

+0

コメントありがとう! :)私はアンドロイド注釈を使用してRestService **インターフェース**でコーミングしているあまりにも多くの残りのコールを処理しています。これらの残りの呼び出しはすべてRestClientExceptionをスローします。しかし、IOExceptionを追加すると、SocketTimeoutExceptionが発生し、残りの呼び出しが行われるたびに処理するように求められます。残りのお電話に変更を加えずにこれを処理する方法はありますか?私はQ:をここに掲載しました:http://stackoverflow.com/q/16542892/1237656 – DroidBee

7

私のソリューションは、このようなものでした。

デフォルトでは、RestTemplateはSimpleClientHttpRequestFactoryを使用し、次にHttpURLConnectionを使用します。デフォルトでは

はHttpURLConnectionのためのタイムアウトは0である - すなわち、無限、それはこれらのプロパティで設定されていない限り:

-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec 
+0

現在設定されている値を問い合わせるAPIはありますか?値を設定するためにHttpComponentsClientHttpRequestFactoryのセッターを見ることができますが、値を直接照会する対応するゲッターはありませんか? –

関連する問題