4

RestTemplate を使用して、Spring Web サービスのクライアント側でタイムアウトを構成したいと考えています。次の構成を試しました:

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<constructor-arg>
    <bean class="org.springframework.http.client.CommonsClientHttpRequestFactory">
    <property name="readTimeout" value="10000" />
    </bean>
</constructor-arg>
    <property name="messageConverters">
    <list>
    <ref bean="stringHttpMessageConverter" />
    <ref bean="marshallingHttpMessageConverter" />
    </list>
    </property>
</bean>

しかし、Tomcat を起動すると NoClassDefFoundError が発生します。

06 févr. 2012 10:43:43,113 [ERROR,ContextLoader] Context initialization failed
java.lang.NoClassDefFoundError: org/apache/commons/httpclient/HttpMethodBase

ただし、 pom.xml に commons-httpclient を含めました:

    <dependency>
        <groupId>commons-httpclient</groupId>
        <artifactId>commons-httpclient</artifactId>
        <version>3.1</version>
    </dependency

どうすればそれを修正できるか考えていますか?

前もって感謝します !

4

4 に答える 4

9

Snicolas の回答はほとんど役に立ちましたが、キャスト クラスを変更するだけで済みました。

RestTemplate restTemplate = new RestTemplate();    
((SimpleClientHttpRequestFactory)restTemplate.getRequestFactory()).setReadTimeout(1000*30);

また、接続タイムアウトを設定することもできます:

((SimpleClientHttpRequestFactory)restTemplate.getRequestFactory()).setConnectTimeout(1000*30);
于 2013-07-18T13:27:49.987 に答える
4

これは私のために働いた

( (HttpComponentsClientHttpRequestFactory) getRestTemplate().getRequestFactory() ).setReadTimeout( 120 * 1000 );

Spring Android Rest テンプレートの Android バージョンで使用しました。


デフォルト値は 60 * 1000 です

于 2012-08-30T08:56:05.993 に答える
0

私は同じ問題を抱えていて、最初にSpring構成を変更して修正しようとしましたが、すべて失敗しました。

最後に、次のJVMシステムプロパティを設定することで部分的に修正しました:sun.net.client.defaultConnectTimeout

sun.net.client.defaultReadTimeout

(詳細については、そのリンクをたどってください: http: //docs.oracle.com/javase/1.4.2/docs/guide/net/properties.html

まず、「自家製」の構成Beanを使用して、プロパティファイルに保存されている「接続タイムアウト」と「読み取りタイムアウト」のカスタム値を挿入します。

   <bean id="rmProperties"  class="com.mydomain.myapp.myConfigBean" scope="singleton">
    ...
    <property name="httpRequestConnectTimeout" value="${httpRequestConnectTimeout}" />
    <property name="httpRequestReadTimeout" value="${httpRequestReadTimeout}" />
    ...
    </bean>

次に、次のようにSystem.setProperty(...)メソッドを使用してJVMシステムプロパティを設定します。

    System.setProperty(propName, value);

残っている問題は1つだけです。sun.net.client.defaultConnectTimeoutに設定されている値が考慮されていないようです。さらにいくつかのテストを行った後、プロキシサーバー(私の場合はSquid)を介してターゲットホストに到達しようとすると発生することに気付きました。

ただし、その設定方法を使用するのは不便です。タイムアウト設定は、以降のすべての要求に使用されます。

よろしく

于 2012-03-06T19:10:57.377 に答える