- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
(我问这个问题是为了回答这个问题。几个月前我在 Spring 论坛上问过这个问题,不久之后我通过实验找到了解决方案。但我在这里发布它以防其他人点击同样的场景,因为我被告知要这样做。)
我有一个 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 处理程序方法同步提供响应?
最佳答案
解决方法很简单。如果处理程序方法返回 Object
, Spring 根据其类型决定如何处理结果。如果返回值是 Callable<Foo>
,它会正确触发异步处理。 ,否则立即返回结果,避免缓存结果已经在手时的异步处理开销。
关于spring - 如何在 Spring MVC 中混契约(Contract)步和异步请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24307839/
我是一名优秀的程序员,十分优秀!