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

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

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

但是,使用该设置方法有一个不便:超时设置将用于所有进一步的请求

问候

于 2012-03-06T19:10:57.377 回答
0

我同样需要能够为 web 服务消费设置超时,我只是用另一个 spring conf 来解决它。

首先使用下面的配置,我遇到了与@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>
于 2014-01-17T15:48:11.787 回答