【发布时间】:2021-08-01 15:06:41
【问题描述】:
Spring MVC 让控制器返回 DeferredResult 和 ListenableFuture(由 ListenableFutureTask 实现)来进行异步响应。有什么不同?我应该什么时候使用它们?
【问题讨论】:
标签: java spring spring-mvc asynchronous
Spring MVC 让控制器返回 DeferredResult 和 ListenableFuture(由 ListenableFutureTask 实现)来进行异步响应。有什么不同?我应该什么时候使用它们?
【问题讨论】:
标签: java spring spring-mvc asynchronous
它们在概念上彼此相似,并且可以互换用作控制器的方法结果,这要归功于 ListenableFutureReturnValueHandler 将第二个调整为第一个。
但是,DeferredResult 类和ListenableFuture 接口来自两个不同的世界:
org.springframework.web.context.request.async 包。org.springframework.util.concurrent 软件包,自 4.0 起提供。此外,它们是为不同的需求而添加的。虽然第一个提供了异步提供控制器结果的基本和完整功能,但第二个允许您将实现与现有的类/框架桥接,例如 ExecutorService 框架(参见 ListenableFutureTask)。
因此,底线是,当您可以自行实现进一步处理时,请使用 DeferredResult 类或 ListenableFuture,当您想使用 ExecutorService 时框架。
【讨论】:
DeferredResult 是 Callable 的替代方案,它允许您生成结果。您还可以扩展 DeferredResult 以关联其他数据或行为,以防您稍后需要访问某些数据而无需其他数据结构。但仅此而已。 当您需要向异步任务添加回调时,ListenableFuture 未来会派上用场。 Guava 的 ListenableFuture 实际上允许组合,我不认为 Spring 的 ListenableFuture 可以这样做。 为此,您宁愿使用 Spring 也支持的 CompletableFuture。 您可以非常简单地编写期货,请查看:http://www.deadcoderising.com/java8-writing-asynchronous-code-with-completablefuture/
【讨论】: