使用RestTemplate配置Spring WebServices的超时时间

4

我想在使用RestTemplate的spring webservices客户端上配置超时时间。我尝试了以下配置:

<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个回答

9
Snicolas的答案对我几乎起作用了,只需要更改转换类Class:
RestTemplate restTemplate = new RestTemplate();    
((SimpleClientHttpRequestFactory)restTemplate.getRequestFactory()).setReadTimeout(1000*30);

同时,您可以设置连接超时时间:

((SimpleClientHttpRequestFactory)restTemplate.getRequestFactory()).setConnectTimeout(1000*30);

4
这对我有用。
( (HttpComponentsClientHttpRequestFactory) getRestTemplate().getRequestFactory() ).setReadTimeout( 120 * 1000 );

我在Spring Android Rest Template的Android版本中使用了它。


默认值为60 * 1000。


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);

我只剩下一个问题:在sun.net.client.defaultConnectTimeout中设置的值似乎没有被考虑进去。 经过更多的测试,我意识到当我尝试通过代理服务器(在我的情况下是Squid)访问目标主机时会发生这种情况。

然而,使用该设置方法存在一个不便之处:超时设置将用于所有后续请求。

此致


0

我也有同样的需求,需要能够设置WebService消耗的超时时间,我通过另一个Spring配置解决了这个问题。

首先,使用下面的配置,我遇到了与@jsebFrank相同的问题(java.lang.NoClassDefFoundError: org/apache/commons/httpclient/HttpMethodBase)

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

但是,正如Spring支持文件这里(在16.5节超时处理中)所解释的那样,您可以使用SimpleClientHttpRequestFactory请求工厂(它是Spring RestTemplate的默认请求工厂)。
使用它,我不再有问题:
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
    <constructor-arg>
        <bean
            class="org.springframework.http.client.SimpleClientHttpRequestFactory">
            <property name="connectTimeout" value="10000" />
            <property name="readTimeout" value="10000" />
        </bean>
    </constructor-arg>
    </bean>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接