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 异步结果的主要内容,如果未能解决你的问题,请参考以下文章

spring4.0之三:@RestController

Spring @RestController 用于匿名和授权用户的单一方法

Spring 注解中@RestController与@Controller的区别

Spring 注解中@RestController与@Controller的区别

Spring 注解中@RestController与@Controller的区别

Spring中@Controller和@RestController之间的区别