Spring MVC: DeferredResult和ListenableFuture的区别是什么?

7

Spring MVC可以让控制器返回DeferredResultListenableFuture(由ListenableFutureTask实现)来进行异步响应。它们之间的区别是什么?我应该在什么情况下使用它们?

2个回答

5
它们在概念上相似,可以互换地用作控制器方法的结果,这归功于ListenableFutureReturnValueHandler将第二种适配为第一种。但是,DeferredResult类和ListenableFuture接口来自两个不同的领域:
1. 第一个来自版本3.2中添加的org.springframework.web.context.request.async包。 2. 第二个来自自4.0以来可用的org.springframework.util.concurrent包。
此外,它们是出于不同的需求而添加的。虽然第一个为提供控制器异步结果的基础和完整功能,但第二个允许您将其实现与已存在的类/框架进行桥接,例如ExecutorService框架(请参见ListenableFutureTask)。
因此,总之,当您足以自己实现进一步的处理时,请使用DeferredResult类,或者当您想要使用类似于ExecutorService的框架时,请使用ListenableFuture

3
DeferredResult是Callable的替代品,可让您生成结果。如果需要稍后访问某些数据而不需要额外的数据结构,则还可以扩展DeferredResult以关联其他数据或行为。但就是这样。 当您需要向异步任务添加回调时,ListenableFuture很方便。 Guava的ListenableFuture实际上允许组合,而我没有看到Spring的ListenableFuture可以做到这一点。 对于这个问题,您最好使用CompletableFuture,这也受到Spring的支持。 您可以非常简单地组合期望,看看这个:http://www.deadcoderising.com/java8-writing-asynchronous-code-with-completablefuture/

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接