我想为我的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
我的要求需要更短的超时,因此我需要能够更改这些超时。关于我在做什么错的任何想法吗?
非常感谢。
我认为我们的项目具有commons-httpclient jar的两个不同版本的事实并没有帮助。整理好之后,我发现你可以做两件事…
在代码中,你可以放置以下内容:
HttpComponentsClientHttpRequestFactory rf = (HttpComponentsClientHttpRequestFactory) restTemplate.getRequestFactory(); rf.setReadTimeout(1 * 1000); rf.setConnectTimeout(1 * 1000);
首次调用此代码时,它将设置所HttpComponentsClientHttpRequestFactory使用的类的超时RestTemplate。因此,所有随后的呼叫RestTemplate将使用上面定义的超时设置。
HttpComponentsClientHttpRequestFactory
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在代码中使用接口的位置,并从属性文件中获取超时值。
对于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套它们。
setter
connectionRequestTimeout,connectTimeout
readTimeout
@ConfigurationProperties
对于不使用Spring Boot@Configuration而不是Spring Boot的Spring 4.1或Spring 5XML
@Configuration
@Configuration public class AppConfig { @Bean public RestTemplate customRestTemplate() { HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(); httpRequestFactory.setConnectionRequestTimeout(...); httpRequestFactory.setConnectTimeout(...); httpRequestFactory.setReadTimeout(...); return new RestTemplate(httpRequestFactory); } }