1. ホーム
  2. spring

[解決済み] Spring RestTemplateのタイムアウト

2022-04-27 12:11:58

質問

Webアプリケーションで使用するレストサービスの接続タイムアウトを設定したいのですが、どうすればよいですか? 私はSpringのRestTemplateを使用して、私のサービスと会話しています。 私はいくつかの研究を行い、私はタイムアウトを設定するために意図されていると信じている以下のXML(私のアプリケーションXMLに)を見つけ、使用しました。 私はSpring 3.0を使用しています。

また、同じ問題をここで見ました。 RestTemplateを使用したSpring Webサービスのタイムアウト設定 が、その解決策はないようです。 クリーン タイムアウトの値はSpringのコンフィグで設定したい。

<bean id="RestOperations" class="org.springframework.web.client.RestTemplate">
    <constructor-arg>

      <bean class="org.springframework.http.client.CommonsClientHttpRequestFactory">
        <property name="readTimeout" value="${restURL.connectionTimeout}" />
      </bean>
    </constructor-arg>
</bean>

readTimeoutをどのように設定しても、次のようになるようです。

ネットワークケーブルが切断されました。 約20秒間待機し、以下の例外が報告されます。

org.springframework.web.client.ResourceAccessExcep tion: I/Oエラー。ネストされた例外は java.net.NoRouteToHostException.No route to host: connect です。ホストへのルートがありません: 接続してください

URLが正しくないため、レストサービスから404が返されました。 約10秒待って、次のような例外が報告されます。

org.springframework.web.client.HttpClientErrorException: 404 Not Found

私の要件では、タイムアウトを短くする必要があるので、これらを変更できるようにする必要があります。 何が間違っているのか、何かアイデアはありますか?

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

解決方法は?

ようやく動作するようになりました。

私たちのプロジェクトには、commons-httpclient jarの2つの異なるバージョンがあったことが原因だと思います。 それを解決したら、2つのことができることがわかりました。

コードでは、次のように記述します。

HttpComponentsClientHttpRequestFactory rf =
    (HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory();
rf.setReadTimeout(1 * 1000);
rf.setConnectTimeout(1 * 1000);

このコードが最初に呼び出されたとき、タイムアウトを設定するために HttpComponentsClientHttpRequestFactory クラスが使用する RestTemplate . したがって、それ以降の RestTemplate は、上記で定義されたタイムアウト設定を使用します。

あるいは、もっと良い方法は、こうすることです。

<bean id="RestOperations" class="org.springframework.web.client.RestTemplate">
    <constructor-arg>
        <bean class="org.springframework.http.client.HttpComponentsClientHttpRequestFactory">
            <property name="readTimeout" value="${application.urlReadTimeout}" />
            <property name="connectTimeout" value="${application.urlConnectionTimeout}" />
        </bean>
    </constructor-arg>
</bean>

を使うところは RestOperations インターフェイスを使用し、プロパティファイルからタイムアウト値を取得します。