【发布时间】:2014-06-19 21:45:54
【问题描述】:
(我问这个问题是为了回答这个问题。几个月前我在 Spring 论坛上问过这个问题,不久之后我通过实验找到了解决方案。但我在这里发布它以防有人else 会遇到同样的情况,因为我被告知要这样做。)
我有一个 Spring MVC 端点 /work,它的处理是 IO 绑定的,可能需要几秒钟才能完成。输入 Servlet 3 异步请求和 Spring MVC asynchronous request processing。我可以返回 Callable<Foo> 或 DeferredResult<Foo> 并释放我的 servlet 容器线程,以便在处理过程中做一些有用的事情。
现在其他用户很可能会提出相同的请求。重复已完成的工作是没有意义的,所以我将在工作第一次完成时缓存工作的结果,并希望返回缓存的结果。所以现在,完全相同的处理程序方法可能需要几秒钟或几毫秒才能完成。
我的问题是我只能给处理程序方法一个签名,并且我将它定义为返回Callable<Foo>。我不知道如何为短请求消除这种开销;就目前而言,我将创建一个Callable<Foo>,将其排入长时间运行的任务之后,并等待线程池中的一个线程来处理它,最终为我已经掌握的响应提供服务。我想避免这一切。
如果我使用 DeferredResult<Foo> 而不是 Callable<Foo>,性能会好一些,但我已经从 Spring 托管线程中取出处理,丢失了 Spring Security 的 SecurityContext,并且污染了非带有 Spring 特定 DeferredResult 的 web 代码。
是否有一种有效的方法来有时异步地提供响应,有时从同一个 MVC 处理程序方法同步地提供它们?
【问题讨论】:
标签: spring spring-mvc