【问题标题】:How do I mix synchronous and asynchronous requests in Spring MVC?如何在 Spring MVC 中混合同步和异步请求?
【发布时间】: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


    【解决方案1】:

    解决方案非常简单。如果处理程序方法返回Object,Spring 根据其类型确定如何处理结果。如果返回值为Callable<Foo>,则正确触发异步处理,否则立即返回结果,避免缓存结果在手时的异步处理开销。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-21
      • 2013-11-29
      • 2014-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多