Spring MVC允许控制器返回DeferredResult
和ListenableFuture
(由ListenableFutureTask
实现)来执行异步响应。有什么不同?我什么时候应该使用它们?
答案 0 :(得分:3)
它们在概念上彼此相似,并且可以互换地用作控制器的方法结果,这要归功于ListenableFutureReturnValueHandler
使第二个适应第一个。
但是,DeferredResult
类和ListenableFuture
接口来自两个不同的世界:
org.springframework.web.context.request.async
包。org.springframework.util.concurrent
包中的第二个。此外,它们是为满足不同需求而添加的。虽然第一个提供了基本和完整的功能来异步提供控制器的结果,但第二个允许您除了使用现有的类/框架桥接您的实现,例如ExecutorService
框架(参见{ {1}})。
所以,最重要的是,使用ListenableFutureTask
课程时,如果您足够自己在或 DeferredResult
进行进一步处理; d喜欢使用ListenableFuture
- 类似框架。
答案 1 :(得分:2)
DeferredResult是Callable的替代品,允许您生成结果。您还可以扩展DeferredResult以关联其他数据或行为,以防您以后需要访问某些数据而无需其他数据结构。但那是关于它的。 当您需要向异步任务添加回调时,ListenableFuture的未来会派上用场。 Guava的ListenableFuture实际上允许合成,我没有看到Spring的ListenableFuture。 为此,你宁愿使用CompletableFuture,Spring也支持它。 您可以非常简单地撰写期货,请查看:http://www.deadcoderising.com/java8-writing-asynchronous-code-with-completablefuture/