【问题标题】:Send response asynchronously in Spring boot在 Spring Boot 中异步发送响应
【发布时间】:2014-12-22 04:54:41
【问题描述】:

需要在我的基于 Spring Boot 的 REST 应用程序中添加以下功能:

当调用 POST 方法时,会启动一个长时间运行的进程。每隔一段时间(每 5 秒左右),我需要在浏览器中向用户显示一条消息,直到流程结束。

注意:这个方法不能仅仅从浏览器调用。将来可能会从 shell 脚本中调用。目标是在“响应正文”中间歇性地发送响应。

我尝试添加如下代码:

                    OutputStream os = response.getOutputStream();
                    os.write(msg.getBytes());
                    os.flush();

但在刷新时出现 NullPointer 异常。

我该怎么做?我是否必须进行 AJAX 调用或类似的调用?

【问题讨论】:

  • 您的“长期运行的进程”是否作为不同的线程启动并立即提交响应?
  • 不,它没有作为不同的线程启动并且没有提交响应。

标签: java spring servlets jackson spring-boot


【解决方案1】:

这里有几个问题。最基本的一点是,HTTP 并非旨在为单个请求发送多个响应。其次,在长时间运行的进程期间阻塞请求处理线程可能会导致问题。

更好的方法是在长时间运行的进程启动后立即发送响应。该响应将具有202 Accepted 状态代码和Location 标头,该标头提供另一个URI,客户端可以轮询该URI 以获取有关长时间运行的任务的信息。例如:Location: https://yourapi.example.com/tasks/123456。然后,客户端有责任针对此任务 URI 执行 GET 请求,以获取有关长时间运行进程的进度的信息。

【讨论】:

  • 嗨,我也需要同样的东西。我发送请求以获取 10 个部分的数据。一旦我检索到 5 部分数据,我需要返回 UI,然后过一段时间我需要发送剩余的部分数据。是否有任何代码sn-p。如果存在,请分享。
  • 如果要查找更多信息,这种 API 编程模型叫什么?
  • 对于那些可能觉得它有用的人。我发现了一个 github 项目,它大致按照这条评论的建议:github.com/katezer/asynchronous-rest-api
猜你喜欢
  • 2017-11-04
  • 1970-01-01
  • 2019-03-04
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-23
  • 1970-01-01
相关资源
最近更新 更多