java - 在服务器端完成某些处理之前,如何保持或休眠一个 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线程,对整个服务器有什么影响吗?是否会对其他请求造成任何问题。
- www.test.com
- 输入用户名和密码 - POST
- 服务器在其本地数据库中验证,向第三方应用程序发送请求以获取与他的用户名相关的一些报价。
- 创建报价请求 - 收到状态为“正在准备中”的响应
- 得到报价 - “正在准备中”
- 等待/睡眠 1 秒
- 得到报价 - “正在准备中”
- 等待/睡眠 1 秒
- 得到报价 - “正在准备中”
- 等待/睡眠 1 秒
- 得到报价 - “完成”
- 以 JSON 格式发送响应。
同样可以用不同的方式完成。
- www.test.com
- 输入用户名和密码 - POST
- 服务器在其本地数据库中验证,向第三方应用程序发送请求以获取与他的用户名相关的一些报价。
- 创建报价请求 - 收到状态为“正在准备中”的响应
- 将 request_id 存储在数据库中。
- 以 JSON 格式发送响应
- 使用 request_id 轮询服务器
- “正在准备中”
- 设置超时(1 秒)
- 使用 request_id 轮询服务器
- “正在准备中”
- 设置超时(1 秒)
- 使用 request_id 轮询服务器
- “正在准备中”
- 设置超时(1 秒)
- 使用 request_id 轮询服务器
- “完全的”
两种情况都有不同。
第一个,我不会每隔一秒就用 http 调用淹没我的网络服务器。相反,我持有第一个 http 请求并等待来自报价服务的响应,然后处理响应。我的问题是如何保持或使该请求线程以 1 秒的频率休眠。
第二个是连续轮询,它会淹没网络服务器。
解决方案
我认为您的方法很有趣,但远非有效。在开发 Web 应用程序时,有更优雅的方式来报告进程状态。以 SignalR 或 SocketIO 为例。这样您就不必维护与服务器的开放连接,而是将工作状态推送到客户端。
推荐阅读
- jquery - 无法使用 jquery append 生成多个 div
- ms-access - 子表单中每个相关记录的空字段
- ios - NSKeyedArchiver 有时会生成损坏的文件
- r - 尝试子集化时出现未定义列错误
- r - 如何在 ggplot2 中使用 facet_grid 组合三个堆叠线图中的两个?
- c# - 如何从 Swagger ui 中隐藏特定操作方法的模型参数
- javascript - 如何编写 mysql 查询以获取 JSON 输出?
- bixby - 如何在bixby中获取用户的时区信息?
- c# - 使用 HttpWebRequest 连接到远程服务器时出错
- ruby-on-rails - Rails fields_for不在页面上呈现