gpt4 book ai didi

spring - 如何在 Spring MVC 中混契约(Contract)步和异步请求?

转载 作者:行者123 更新时间:2023-12-03 10:02:32 25 4
gpt4 key购买 nike

(我问这个问题是为了回答这个问题。几个月前我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com