我从http servlet调用了沉重而耗时的逻辑。请求超时会发生什么? servlet容器会挂起底层http线程吗?或者它会继续运行?当请求超时时,http servlet会发生什么?
回答
它会一直运行,不知道请求请求的客户端可能已经过去了。
线程池
应用服务器通常拥有一个有界ThreadPool服务请求。这些池可用于每个Web应用程序,甚至可以作为servlet/EJB的目标。当您长时间(或永久)运行线程时,它会使用线程池中的线程,并且在完成之前永远不会返回该线程。这可能会导致线程池达到其最大大小,并最终降低对Web应用程序的调用性能。
还有一个无界线程池的概念,其中池可以使用的最大线程数仅受硬件限制。这对于服务器定义的“服务质量”属性来说可能是个坏主意,因为无界池会影响整个机器,而不仅仅是导致问题的WAR /代码。
阻塞线程
某些应用程序服务器有规定,这种检测和标记这样的线程的STUCK。有JMX apis可以杀死线程,或者您可以释放WAR以将线程释放回池中。
超时
超时适用于HTTP层,而不适用于服务器端。你有不同的HTTP超时时间,比如。
- 连接超时 - 建立连接所用的时间。
- 读取超时 - 由于客户端花费太长时间来读取响应而发生超时。
SO超时 - 整个操作的套接字超时。
该servlet不知道这些。当写封闭连接时,您应该看到如下错误: - Connection close by remote host
想要避免所有这些吗?编写一个快速处理请求并尽快返回的servlet。这将保持高吞吐量和用户的乐趣。
没有这样的事情,“SO超时 - 整个操作的套接字超时”。有连接超时和读取超时,没有别的。 – EJP 2013-04-12 00:07:48
@EJP在研究你的评论之后,我不得不重新定义我对基础SO超时的理解。我一直认为阅读超时更细。我会编辑答案。谢谢。 – 2013-04-12 05:03:11
我希望通过'重新定义我的理解',你的意思是'检查我的事实*而不是做出来'。这里还有更多的发明。其余的超时,实际存在的超时,处于TCP层,而不是HTTP层,它们适用于双方。 “诸如”由远程主机关闭的连接“之类的错误是你想象力的另一个瑕疵。我希望你的意思是'通过同行重置连接',但你总是可以第一时间做到。而关于线程池的整个题外话与它无关。 – EJP 2013-04-12 10:23:55
servlet线程仍在运行,因为超时是客户端行为,唯一的影响是客户端关闭请求的输入流(servlet的输出流),结果可能不会发送到客户端。
我认为超时是servlet容器特定的。一旦达到服务器通常会发送类似HTTP错误408请求超时。我不问当由于连接不通等原因发生超时时会发生什么。 – adrift 2013-04-11 12:45:55
http请求超时由客户端指定。 – BlackJoker 2013-04-11 12:48:09
- 1. 当在向ASP.NET MVC的AJAX请求中发生网络请求超时时会发生什么操作
- 2. HTTP请求超时
- 3. 当HTTP请求使用不同的浏览器头时会发生什么?
- 4. Android设备在发出http请求时发生超时错误
- 5. mule ce 3.7.0发送http请求时发生异常 - 超时(java.util.concurrent.TimeoutException)
- 6. 为什么NSURLConnection在发送很多请求时会超时?
- 7. HTTP,408请求超时
- 8. 大型资源创建请求超时时会发生什么情况?
- 9. 路由发生变化时,为什么不发出HTTP请求?
- 10. 快递Http请求超时
- 11. 当nginx + uwsgi + django中的响应超时时会发生什么?
- 12. 当Heroku SQL查询超时时会发生什么?
- 13. 当发生超时时,SqlCommand.ExecuteXXX()会返回什么错误号码
- 14. Express.js HTTP请求超时
- 15. Http请求超时问题
- 16. http发布请求中的Angular2超时
- 17. 中断HTTP流时会发生什么?
- 18. 超时http请求? Android
- 19. 去HTTP请求超时
- 20. 关闭输出流后,servlet请求会发生什么?
- 21. 在写入快照复制时发生写请求时会发生什么?
- 22. 什么时候servlet HTTP会话启动?
- 23. 当从QueryPath访问OpenAmplify时,我的HTTP请求失败/超时。为什么?
- 24. 当我在链接上发送ajax请求时会发生什么?
- 25. 请求超时 - 请求超时
- 26. 超时发出过多AFNetworking当请求
- 27. HTTP请求超载/超时使用python
- 28. 当localStorage已满时会发生什么?
- 29. 当redis重载时会发生什么?
- 30. 当我ping 127.0.0.1时会发生什么
我认为它应该继续运行。要尝试一下,写一个刚刚进入无限循环的HttpServlet。附上一个调试器来确定该线程发生了什么。 – austin 2013-04-11 12:38:18