当请求超时时,http servlet会发生什么?

时间:2013-04-11 12:32:04

标签: java servlets

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

它将继续不知道请求请求的客户端可能早就消失了。

的线程池

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

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

被困线程

某些应用程序服务器具有检测此功能的条款,并将此类线程标记为STUCK。有JMX apis可以杀死线程,或者你可以使用WAR来使线程被释放回池中。

超时

超时适用于HTTP层,而不适用于服务器端。你是各种HTTP超时,例如。

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

servlet没有意识到这些。写入已关闭的连接时,您应该会看到错误,例如 - Connection close by remote host

想避免这一切吗?编写一个servlet,快速处理您的请求并尽快返回。这将保持您的吞吐量高,用户满意。