【问题标题】:Spring RestController Async ResultsSpring RestController 异步结果
【发布时间】: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(您可以实现)。你不需要为此定制任何东西。

标签: rest spring-mvc spring-boot spring-rest


【解决方案1】:

要使用 Spring 实现该博客文章中推荐的行为,您应该从控制器返回 CompletableFuture,除非该未来已经完成(状态代码应为 201 在此案例)。

否则,您应该只使用Location 标头(包含创建任务URL)和202 状态代码构建一个空响应,并返回该状态代码,如果isDone() 返回false 为你的未来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-30
    相关资源
    最近更新 更多