web-dev-qa-db-ja.com

RestTemplate-デフォルトのタイムアウト値

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

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

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

RestTemplateに組み込みのタイムアウト値はありますか?タイムアウト値を変更する予定はありませんが、すべてのリクエストに適切なタイムアウトが設定されるようにします。

27
saravana_pc

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

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

19
Jigar Parekh

質問に明示的に回答するには...

デフォルトのタイムアウトは無限です。

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

デフォルトでは、HttpURLConnectionのタイムアウトは0です。つまり、これらのプロパティで設定されていない限り、無限です。

-Dsun.net.client.defaultConnectTimeout=TimeoutInMiliSec 
-Dsun.net.client.defaultReadTimeout=TimeoutInMiliSec 
16
nevster

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);
        }
    }
}
12
agamov

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());
1
Carlos Cuesta