【发布时间】:2016-05-28 06:09:31
【问题描述】:
我在我的项目中设置了一个 RestTemplate 和一个 AsyncRestTemplate,类似于以下内容:
http://vincentdevillers.blogspot.fr/2013/10/a-best-spring-asyncresttemplate.html
我注意到连接超时实际上不起作用,除非我将 httpRequestFactory() bean 更改为以下内容:
@Bean
public ClientHttpRequestFactory httpRequestFactory() {
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient());
factory.setConnectTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
factory.setReadTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
return factory;
}
如果我将 DEFAULT_READ_TIMEOUT_MILLISECONDS 设置为 5,当我使用 restTemplate 时会发生超时(如预期的那样)。但是,当我使用 AsyncRestTemplate 时,不会发生超时。我已经像 httpRequestFactory() 一样修改了 asyncHttpRequestFactory(),但没有骰子。
@Bean
public AsyncClientHttpRequestFactory asyncHttpRequestFactory() {
HttpComponentsAsyncClientHttpRequestFactory factory = new HttpComponentsAsyncClientHttpRequestFactory(asyncHttpClient());
factory.setConnectTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
factory.setReadTimeout(DEFAULT_READ_TIMEOUT_MILLISECONDS);
return factory;
}
这是我尝试在 Spring MVC 控制器中使用 AsyncRestTemplate 的方式:
String url = "...";
// Start the clock
long start = System.currentTimeMillis();
ListenableFuture<ResponseEntity<String>> results = asyncRestTemplate.getForEntity(url, String.class);
// Wait until the request is finished
while (!(results.isDone())) {
Thread.sleep(10); //millisecond pause between each check
}
System.out.println("Elapsed time: " + (System.currentTimeMillis() - start));
return results.get().getBody();
如何让 AsyncRestTemplate 读取我的连接超时设置?
在相关说明中,https://spring.io/guides/gs/async-method/ 使用 @Async 和 RestTemplate 并且似乎完成了我正在寻找的内容。与 RestTemplate 相比,使用 AsyncRestTemplate 有什么优势?
【问题讨论】:
-
查看源代码
HttpComponentsAsyncClientHttpRequestFactory会忽略connectTimeout和readTimeout属性。我不知道为什么。 -
嗨。对不起,但有人可以解决这个问题吗?我有同样的疑问:stackoverflow.com/questions/50594022/…
标签: spring spring-mvc asynchronous resttemplate