今天我在AsyncRestTemplate上做了一些实验。下面是一段示例代码:
ListenableFuture<ResponseEntity<MyObject[]>> result
= asyncRestTemplate.getForEntity(uri, MyObject[]);
List<MyObject> objects = Arrays.asList(result.get().getBody());令我惊讶的是,请求不是在第一行(即调用getForEntity之后)发送给uri的,而是在调用result.get()之后发送的。
这不是一种同步的做事方式吗?
发布于 2015-10-23 18:13:56
执行异步请求的整个思路是,要么您不想等待异步任务启动/完成,要么您希望主线程在请求来自Future实例的结果之前执行其他任务。在内部,AsyncRestTemplate准备一个AsyncRequest并调用executeAsync方法。
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等,不应依赖。
发布于 2015-10-13 20:58:22
当您调用future.get()时,您实际上是在通过等待结果将异步操作转换为同步操作。
什么时候执行实际的请求并不重要,重要的是因为它是异步的,所以你不需要担心它,除非/直到你需要结果。
当您需要在处理结果之前执行其他工作时,或者根本不等待结果时,这种优势是显而易见的。
https://stackoverflow.com/questions/33103096
复制相似问题