2013-04-11 50 views
1

我从http servlet调用了沉重而耗时的逻辑。请求超时会发生什么? servlet容器会挂起底层http线程吗?或者它会继续运行?当请求超时时,http servlet会发生什么?

+0

我认为它应该继续运行。要尝试一下,写一个刚刚进入无限循环的HttpServlet。附上一个调试器来确定该线程发生了什么。 – austin 2013-04-11 12:38:18

回答

1

它会一直运行,不知道请求请求的客户端可能已经过去了。

线程池

应用服务器通常拥有一个有界ThreadPool服务请求。这些池可用于每个Web应用程序,甚至可以作为servlet/EJB的目标。当您长时间(或永久)运行线程时,它会使用线程池中的线程,并且在完成之前永远不会返回该线程。这可能会导致线程池达到其最大大小,并最终降低对Web应用程序的调用性能。

还有一个无界线程池的概念,其中池可以使用的最大线程数仅受硬件限制。这对于服务器定义的“服务质量”属性来说可能是个坏主意,因为无界池会影响整个机器,而不仅仅是导致问题的WAR /代码。

阻塞线程

某些应用程序服务器有规定,这种检测和标记这样的线程的STUCK。有JMX apis可以杀死线程,或者您可以释放WAR以将线程释放回池中。

超时

超时适用于HTTP层,而不适用于服务器端。你有不同的HTTP超时时间,比如。

  • 连接超时 - 建立连接所用的时间。
  • 读取超时 - 由于客户端花费太长时间来读取响应而发生超时。
  • SO超时 - 整个操作的套接字超时。

该servlet不知道这些。当写封闭连接时,您应该看到如下错误: - Connection close by remote host

想要避免所有这些吗?编写一个快速处理请求并尽快返回的servlet。这将保持高吞吐量和用户的乐趣。

+0

没有这样的事情,“SO超时 - 整个操作的套接字超时”。有连接超时和读取超时,没有别的。 – EJP 2013-04-12 00:07:48

+0

@EJP在研究你的评论之后,我不得不重新定义我对基础SO超时的理解。我一直认为阅读超时更细。我会编辑答案。谢谢。 – 2013-04-12 05:03:11

+0

我希望通过'重新定义我的理解',你的意思是'检查我的事实*而不是做出来'。这里还有更多的发明。其余的超时,实际存在的超时,处于TCP层,而不是HTTP层,它们适用于双方。 “诸如”由远程主机关闭的连接“之类的错误是你想象力的另一个瑕疵。我希望你的意思是'通过同行重置连接',但你总是可以第一时间做到。而关于线程池的整个题外话与它无关。 – EJP 2013-04-12 10:23:55

2

servlet线程仍在运行,因为超时是客户端行为,唯一的影响是客户端关闭请求的输入流(servlet的输出流),结果可能不会发送到客户端。

+0

我认为超时是servlet容器特定的。一旦达到服务器通常会发送类似HTTP错误408请求超时。我不问当由于连接不通等原因发生超时时会发生什么。 – adrift 2013-04-11 12:45:55

+0

http请求超时由客户端指定。 – BlackJoker 2013-04-11 12:48:09

相关问题