Spring mvc Spring RestTemplate-如何设置连接超时和读取超时

Spring mvc Spring RestTemplate-如何设置连接超时和读取超时,spring-mvc,Spring Mvc,我使用的是Spring3.0.5版本的RestTemplate 有人能帮我吗?如何为每个请求设置connecttimeout和readTimeout值 但在最新版本中,有一个使用HttpComponents客户端HttpRequestFactory类的解决方案。但我需要使用spring.web.3.0.5版本,您可以在 org.springframework.http.client.HttpComponentsClientHttpRequestFactory 或者在另一个ClientHttpR

我使用的是Spring3.0.5版本的RestTemplate 有人能帮我吗?如何为每个请求设置connecttimeout和readTimeout值

但在最新版本中,有一个使用HttpComponents客户端HttpRequestFactory类的解决方案。但我需要使用spring.web.3.0.5版本,您可以在

org.springframework.http.client.HttpComponentsClientHttpRequestFactory
或者在另一个ClientHttpRequestFactory实现中

要将其配置为RestTemplate使用

restTemplate.setRequestFactory

或者将其配置为bean属性。

您可以使用替代解决方案(spring_web-3.0.5的问题),如
private void setTimeout(RestTemplate restTemplate, int timeout) {
    //Explicitly setting ClientHttpRequestFactory instance to     
    //SimpleClientHttpRequestFactory instance to leverage 
    //set*Timeout methods
    restTemplate.setRequestFactory(new SimpleClientHttpRequestFactory());
    SimpleClientHttpRequestFactory rf = (SimpleClientHttpRequestFactory) restTemplate
            .getRequestFactory();
    rf.setReadTimeout(timeout);
    rf.setConnectTimeout(timeout);
}
spring RestTemplate类通过构造CommonClientHttPrequestFactory在内部使用HttpClient.java(commons-httpClients-3.1.jar),因此您可以将其配置为设置属性connectionTimeOut和soTimeout。查看配置

<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
 <constructor-arg>
  <bean  class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
   <property name="params">
   <bean      class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
    <property name="connectionTimeout" value="2000" />
     <!-- <property name="soTimeout" value="2000" />
     soTimeout is same as readTimeout which is used for socket timeout that  waiting for data -->
     </bean>
   </property>
  </bean>
 </constructor-arg>
 </bean>
  <bean id="httpComponentsClientHttpRequestFactory"
    class="org.springframework.http.client.CommonsClientHttpRequestFactory">
  <constructor-arg ref="httpClient" />
   <property name="readTimeout" value="2000"/>
   </bean>

<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
<constructor-arg ref="httpComponentsClientHttpRequestFactory" />
</bean>

我正在使用Spring 5.2,并获得了为RestTemplate对象设置读取和连接超时的干净方法:

@Bean
公共RestTemplate RestTemplate(RestTemplateBuilder){
返回生成器
.setConnectTimeout(持续时间.毫秒(connectTimeoutMillis))
.setReadTimeout(持续时间为毫秒(readTimeoutMillis))
.build();
}

在我的版本中,这些方法不可用。请澄清您使用的是什么版本?您的默认请求工厂可能不是SimpleClientHttpRequestFactory。在这种情况下,您可能还会遇到运行tim问题。因此,在调用我解释的方法之前,请将RestTemplate的requestFactory设置为SimpleClientHttpRequestFactory作为RestTemplate.setRequestFactory(新的SimpleClientHttpRequestFactory()),我们使用的是Spring-web 3.0.5版本,因此,在上述方法不可用的情况下,RestTemplate可能正在使用和ClientHttpPrequestFactory的实例,而不是SimpleClientHttpRequestFactory。您可以尝试在这个方法的开头显式地设置它。我将编辑上面的代码。你现在可以试试。请注意,SimpleClientHttpRequestFactory适用于3.0以后的版本,因此您不会遇到任何问题。是的,Balaji SimpleClientHttpRequestFactory适用于3.0版。向前。但在该版本中,rf.setReadTimeout(超时);设置连接超时(超时);方法不可用。有人知道如何获取系统超时吗?SimpleClientHttpRequestFactory使用-1值,这意味着不是无限的,而是系统默认值。
@Configuration
public class AppConfig {

    @Bean
    public RestTemplate restTemplate() {

        var factory = new SimpleClientHttpRequestFactory();

        factory.setConnectTimeout(3000);
        factory.setReadTimeout(3000);

        return new RestTemplate(factory);
    }
}