首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AsyncRestTemplate何时发送请求?

AsyncRestTemplate何时发送请求?
EN

Stack Overflow用户
提问于 2015-10-13 20:46:15
回答 2查看 1K关注 0票数 2

今天我在AsyncRestTemplate上做了一些实验。下面是一段示例代码:

代码语言:javascript
复制
ListenableFuture<ResponseEntity<MyObject[]>> result 
                          = asyncRestTemplate.getForEntity(uri, MyObject[]);
List<MyObject> objects = Arrays.asList(result.get().getBody());

令我惊讶的是,请求不是在第一行(即调用getForEntity之后)发送给uri的,而是在调用result.get()之后发送的。

这不是一种同步的做事方式吗?

EN

回答 2

Stack Overflow用户

发布于 2015-10-23 18:13:56

执行异步请求的整个思路是,要么您不想等待异步任务启动/完成,要么您希望主线程在请求来自Future实例的结果之前执行其他任务。在内部,AsyncRestTemplate准备一个AsyncRequest并调用executeAsync方法。

代码语言:javascript
复制
AsyncClientHttpRequest request = createAsyncRequest(url, method);
            if (requestCallback != null) {
                requestCallback.doWithRequest(request);
            }
            ListenableFuture<ClientHttpResponse> responseFuture = request.executeAsync();

有两种不同的实现- HttpComponentsAsyncClientHttpRequest (使用Apache http component库中提供的高性能异步支持)和SimpleBufferingAsyncClientHttpRequest (使用J2SE类提供的工具)。在HttpComponentsAsyncClientHttpRequest中,它在内部有一个线程工厂(不是spring托管的AFAIK),而在SimpleBufferingAsyncClientHttpRequest中,提供了Spring托管的AsyncListenableTaskExecutor。关键是,在所有情况下,都有某种类型的ExecutorService能够异步运行任务。当然,与这些线程池一样,任务的实际开始时间是不确定的,并且取决于许多因素,如负载、可用CPU等,不应依赖。

票数 2
EN

Stack Overflow用户

发布于 2015-10-13 20:58:22

当您调用future.get()时,您实际上是在通过等待结果将异步操作转换为同步操作。

什么时候执行实际的请求并不重要,重要的是因为它是异步的,所以你不需要担心它,除非/直到你需要结果。

当您需要在处理结果之前执行其他工作时,或者根本不等待结果时,这种优势是显而易见的。

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

https://stackoverflow.com/questions/33103096

复制
相关文章

相似问题

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