首页 > 解决方案 > 在服务器端完成某些处理之前,如何保持或休眠一个 http 请求?

问题描述

我有一个网络应用程序。UI 客户端触发对服务器的 http 请求。服务器在发送响应之前必须保持响应几秒钟。这个等待时间 - 是联系一些其他第三方服务。我们向第三方服务发送请求,并每隔 1 秒对其轮询几秒钟以查看某些特定状态。在此循环结束后,发送 UI 客户端的响应。所以

var state = send request to third party
while(state = "poll" ) {
   do I need to sleep the current thread like sleep(currentThread, 1sec) ? 
   call third party again to know the state.
}

开发人员通常如何做到这一点?如果我们阻塞当前的http线程,对整个服务器有什么影响吗?是否会对其他请求造成任何问题。

  1. www.test.com
  2. 输入用户名和密码 - POST
  3. 服务器在其本地数据库中验证,向第三方应用程序发送请求以获取与他的用户名相关的一些报价。
    1. 创建报价请求 - 收到状态为“正在准备中”的响应
    2. 得到报价 - “正在准备中”
    3. 等待/睡眠 1 秒
    4. 得到报价 - “正在准备中”
    5. 等待/睡眠 1 秒
    6. 得到报价 - “正在准备中”
    7. 等待/睡眠 1 秒
    8. 得到报价 - “完成”
  4. 以 JSON 格式发送响应。

同样可以用不同的方式完成。

  1. www.test.com
  2. 输入用户名和密码 - POST
  3. 服务器在其本地数据库中验证,向第三方应用程序发送请求以获取与他的用户名相关的一些报价。
    1. 创建报价请求 - 收到状态为“正在准备中”的响应
    2. 将 request_id 存储在数据库中。
  4. 以 JSON 格式发送响应
  5. 使用 request_id 轮询服务器
  6. “正在准备中”
  7. 设置超时(1 秒)
  8. 使用 request_id 轮询服务器
  9. “正在准备中”
  10. 设置超时(1 秒)
  11. 使用 request_id 轮询服务器
  12. “正在准备中”
  13. 设置超时(1 秒)
  14. 使用 request_id 轮询服务器
  15. “完全的”

两种情况都有不同。

第一个,我不会每隔一秒就用 http 调用淹没我的网络服务器。相反,我持有第一个 http 请求并等待来自报价服务的响应,然后处理响应。我的问题是如何保持或使该请求线程以 1 秒的频率休眠。

第二个是连续轮询,它会淹没网络服务器。

标签: java.netnode.jshttp

解决方案


我认为您的方法很有趣,但远非有效。在开发 Web 应用程序时,有更优雅的方式来报告进程状态。以 SignalR 或 SocketIO 为例。这样您就不必维护与服务器的开放连接,而是将工作状态推送到客户端。


推荐阅读