spring mvc:DeferredResult和ListenableFuture之间的区别?

时间:2016-06-17 04:47:13

标签: java spring spring-mvc asynchronous

Spring MVC允许控制器返回DeferredResultListenableFuture(由ListenableFutureTask实现)来执行异步响应。有什么不同?我什么时候应该使用它们?

2 个答案:

答案 0 :(得分:3)

它们在概念上彼此相似,并且可以互换地用作控制器的方法结果,这要归功于ListenableFutureReturnValueHandler使第二个适应第一个。

但是,DeferredResult类和ListenableFuture接口来自两个不同的世界:

  1. 首先来自版本3.2中添加的org.springframework.web.context.request.async包。
  2. 自4.0以来可用的org.springframework.util.concurrent包中的第二个。
  3. 此外,它们是为满足不同需求而添加的。虽然第一个提供了基本和完整的功能来异步提供控制器的结果,但第二个允许您除了使用现有的类/框架桥接您的实现,例如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/