一尘不染

Spring RestTemplate超时

spring

我想为我的Web应用程序使用的rest服务设置连接超时。我正在使用Spring的RestTemplate与我的服务交谈。我进行了一些研究,发现并使用了下面的xml(在我的应用程序xml中),我认为这是为了设置超时。我正在使用Spring 3.0。

我在这里也看到了同样的问题,使用RestTemplate为Spring Web服务设置超时,但是解决方案似乎不太干净,我更愿意通过Spring config设置超时值

<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.ResourceAccessException:I / O错误:没有通往主机的路由:connect; 嵌套的异常是java.net.NoRouteToHostException:没有路由到主机:connect

网址不正确,因此REST服务返回404: 等待大约10秒,并报告以下异常:

org.springframework.web.client.HttpClientErrorException:找不到404

我的要求需要更短的超时,因此我需要能够更改这些超时。关于我在做什么错的任何想法吗?

非常感谢。


阅读 720

收藏
2020-04-11

共2个答案

一尘不染

我认为我们的项目具有commons-httpclient jar的两个不同版本的事实并没有帮助。整理好之后,我发现你可以做两件事…

在代码中,你可以放置​​以下内容:

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在代码中使用接口的位置,并从属性文件中获取超时值。

2020-04-11
一尘不染

对于Spring Boot> = 1.4

@Configuration
public class AppConfig
{
    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) 
    {
        return restTemplateBuilder
           .setConnectTimeout(...)
           .setReadTimeout(...)
           .build();
    }
}

对于Spring Boot <= 1.3

@Configuration
public class AppConfig
{
    @Bean
    @ConfigurationProperties(prefix = "custom.rest.connection")
    public HttpComponentsClientHttpRequestFactory customHttpRequestFactory() 
    {
        return new HttpComponentsClientHttpRequestFactory();
    }

    @Bean
    public RestTemplate customRestTemplate()
    {
        return new RestTemplate(customHttpRequestFactory());
    }
}

然后在你的 application.properties

custom.rest.connection.connection-request-timeout=...
custom.rest.connection.connect-timeout=...
custom.rest.connection.read-timeout=...

这工作,因为HttpComponentsClientHttpRequestFactory有公共setter方法connectionRequestTimeout,connectTimeout以及readTimeout@ConfigurationProperties套它们。

对于不使用Spring Boot@Configuration而不是Spring Boot的Spring 4.1或Spring 5XML

@Configuration
public class AppConfig
{
    @Bean
    public RestTemplate customRestTemplate()
    {
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setConnectionRequestTimeout(...);
        httpRequestFactory.setConnectTimeout(...);
        httpRequestFactory.setReadTimeout(...);

        return new RestTemplate(httpRequestFactory);
    }
}
2020-04-11