Spring RestController 异步结果
Posted
技术标签:
【中文标题】Spring RestController 异步结果【英文标题】:Spring RestController Async Results 【发布时间】:2017-10-07 08:37:28 【问题描述】:博文http://farazdagi.com/blog/2014/rest-long-running-jobs(以及引用的资源)建议在使用REST等待长时间运行的作业时使用以下场景
如果在返回请求时结果已经可用,则立即返回有效负载。看起来像是带有状态代码 OK 的标准请求。 响应状态码 ACCEPTED 并添加 Location 以及 Async-Result 标头,让客户认识到他们应该... 使用 GET 轮询返回的位置并等待 Async-Result 标头更改为可用或已取消。 如果可用,则返回状态代码 SEE_OTHER 并返回另一个 Location 标头。按照位置获取结果。我知道我可以返回,例如来自方法的CompletableFuture
,但这将阻止请求,直到未来完成。在 Spring MVC 中是否支持这种行为,或者有什么方法可以增强 Spring MVC 来实现这种行为(例如,实现 org.springframework.web.method.support.HandlerMethodReturnValueHandler
?)
【问题讨论】:
您已经可以这样做了。没有什么能阻止您使用常规的@RestController
... 您将有 1 个返回 1 或 2 的方法。如果是 2,您的客户端需要轮询给定的 URL(您可以实现)。你不需要为此定制任何东西。
【参考方案1】:
要使用 Spring 实现该博客文章中推荐的行为,您应该不从控制器返回 CompletableFuture
,除非该未来已经完成(状态代码应为 201
在此案例)。
否则,您应该只使用Location
标头(包含创建任务URL)和202
状态代码构建一个空响应,并返回该状态代码,如果isDone()
返回false
为你的未来。
【讨论】:
以上是关于Spring RestController 异步结果的主要内容,如果未能解决你的问题,请参考以下文章
Spring @RestController 用于匿名和授权用户的单一方法
Spring 注解中@RestController与@Controller的区别
Spring 注解中@RestController与@Controller的区别