Spring RestController异步结果

时间:2017-05-09 06:48:55

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

博客文章http://farazdagi.com/blog/2014/rest-long-running-jobs(以及引用的资源)建议在使用REST等待长时间运行的作业时使用以下方案

  • 如果返回请求时结果已经可用,则立即返回有效负载。看起来像标准请求,状态代码为OK。
  • 回复状态代码ACCEPTED并添加一个位置以及一个Async-Result标头,让客户认识到他们应该......
  • 使用GET轮询返回的位置,并等待Async-Result标题更改为Available或Cancelled。
  • 如果可用状态代码SEE_OTHER,则返回另一个Location标头。按照位置获得结果。

我知道我可以返回,例如来自方法的CompletableFuture,但这将阻止请求,直到将来完成。在Spring MVC中是否有对此类行为的支持,或者我是否可以通过任何方式增强Spring MVC来实现此行为(例如,实现org.springframework.web.method.support.HandlerMethodReturnValueHandler?)

1 个答案:

答案 0 :(得分:0)

要实现使用Spring在该博客文章中建议的行为,您应该从控制器返回CompletableFuture,除非该未来已经完成(状态代码应为{{1}在这种情况下)。

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