首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Spring的AsyncRestTemplate上设置超时?

如何在Spring的AsyncRestTemplate上设置超时?
EN

Stack Overflow用户
提问于 2014-02-22 03:37:55
回答 4查看 8.7K关注 0票数 9

我在我的项目中设置了一个RestTemplate和一个AsyncRestTemplate,如下所示:

http://vincentdevillers.blogspot.fr/2013/10/a-best-spring-asyncresttemplate.html

我注意到,连接超时实际上并不起作用,除非我将httpRequestFactory() bean更改为以下值:

代码语言:javascript
复制
@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(),但是没有什么问题。

代码语言:javascript
复制
@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的方法:

代码语言:javascript
复制
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有什么优势?

EN

回答 4

Stack Overflow用户

发布于 2016-05-28 00:36:05

sync one非常相似:

代码语言:javascript
复制
final SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
requestFactory.setTaskExecutor(new SimpleAsyncTaskExecutor());
requestFactory.setConnectTimeout(connectTimeout);
requestFactory.setReadTimeout(readTimeout);

final AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
asyncRestTemplate.setAsyncRequestFactory(requestFactory); 

source code中,您可以看到AsyncRestTemplate实例是使用SimpleClientHttpRequestFactorySimpleAsyncTaskExecutor创建的。因此,您可以使用设置了超时值的SimpleClientHttpRequestFactory实例来执行相同的操作。

票数 5
EN

Stack Overflow用户

发布于 2014-03-27 10:32:50

AsyncRestTemplate依赖于HTTP client的NIO功能,因此您可以使用少量线程来管理大量连接。要用@Async + RestTemplate实现同样的效果,需要更多的资源。如果你只在几个地方做这件事,那么这可能是可以的,尽管即使这样,因为AsyncRestTemplate已经存在,所以对于用例来说,它是更好和更专业的。

至于读取超时,它看起来可能是一个疏忽。您可以随意创建票证。快速浏览一下"HttpAsyncClient configuration“示例this page,可以看到它使用了:

IOReactorConfig.custom().setConnectTimeout(30000)

我想你可以试一试

票数 4
EN

Stack Overflow用户

发布于 2014-03-27 01:41:22

我认为AsyncRestTemplate的意义在于ListenableFuture (你并没有真正使用它的特性)。因此,@Async可能适用于您的用例。此外,我认为results.get(5,TimeUnit.SECOND)比使用Thread.sleep(...)进行循环更高效(也更优雅),但我想这取决于您。也许我漏掉了什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21943662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档