Spring MVC:DeferredResult和ListenableFuture之间的区别?

pio*_*rek 5 java spring asynchronous spring-mvc

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

小智 5

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

然而,DeferredResult类和ListenableFuture接口都来自两个不同的世界:

  1. 首先来自org.springframework.web.context.request.async3.2 版中添加的包。
  2. org.springframework.util.concurrent自 4.0 以来可用的软件包中的第二个。

此外,它们是为满足不同的需求而添加的。虽然第一个提供了异步提供控制器结果的基本和完整的功能,但第二个还允许您将实现与现有的类/框架桥接起来,例如ExecutorService框架(参见 参考资料ListenableFutureTask)。

所以最重要的是,DeferredResult当你可以自己实现进一步的处理或者 ListenableFuture当你想使用类似ExecutorService框架时,使用这个类。


Uli*_*ses 3

DeferredResult 是 Callable 的替代方案,允许您生成结果。您还可以扩展 DeferredResult 来关联其他数据或行为,以防您稍后需要访问某些数据而不需要其他数据结构。但仅此而已。当您需要向异步任务添加回调时,ListenableFuture future 会派上用场。Guava 的 ListenableFuture 实际上允许组合,但我不认为 Spring 的 ListenableFuture 会这样做。为此,您宁愿使用 CompletableFuture,Spring 也支持它。您可以非常简单地编写 futures,请查看:http://www.deadcoderising.com/java8-writing-asynchronous-code-with-completablefuture/