我从http servlet调用了大量耗时的逻辑。请求超时后会发生什么? servlet容器会挂起底层的http线程吗?或者它会继续运行?
答案 0 :(得分:2)
servlet线程仍在运行,因为超时是客户端行为,唯一的影响是客户端关闭请求的输入流(servlet的输出流),结果可能不会发送到客户端。
答案 1 :(得分:1)
它将继续不知道请求请求的客户端可能早就消失了。
应用程序服务器通常包含有限ThreadPool来处理请求。这些池可用于每个Web应用程序,甚至可以作为servlet / EJB。当您长时间(或永久)运行线程时,它会使用池中的线程,并且在完成之前永远不会返回该资源。这可能导致线程池达到其最大大小,并最终降低对Web应用程序的调用性能。
还有无界线程池的概念,其中池可以使用的最大线程数仅受硬件限制。这可能是服务器定义的“服务质量”属性的一个坏主意,因为无界池可能会影响整个机器,而不仅仅是导致问题的WAR /代码。
某些应用程序服务器具有检测此功能的条款,并将此类线程标记为STUCK。有JMX apis可以杀死线程,或者你可以使用WAR来使线程被释放回池中。
超时适用于HTTP层,而不适用于服务器端。你是各种HTTP超时,例如。
servlet没有意识到这些。写入已关闭的连接时,您应该会看到错误,例如 - Connection close by remote host
想避免这一切吗?编写一个servlet,快速处理您的请求并尽快返回。这将保持您的吞吐量高,用户满意。