我有一个耗时的逻辑需要从http servlet中调用。 当请求超时时会发生什么? Servlet容器会挂起基础的http线程吗?还是它将继续运行?
Servlet线程仍在运行,因为超时是客户端的行为,唯一的影响是客户端关闭请求的输入流(servlet的输出流),结果可能无法发送到客户端。
它将继续运行,不知道请求的客户端可能已经消失。
应用服务器通常包含一个有界的线程池来服务请求。这些池可以针对每个 Web 应用程序或甚至是 Servlet / EJB 进行定制。当您运行一个长时间的线程(或永久线程)时,它会利用线程池中的一个线程,并在完成之前不会返回该资源。这可能会导致线程池达到其最大大小,并最终降低对 Web 应用程序的调用性能。
还有一个无限制的线程池概念,其中池可以使用的线程数仅受硬件限制。这可能不是一个好主意,因为无限制的线程池可能会影响整个机器,而不仅仅是导致问题的 WAR / 代码的“服务质量”属性。
一些应用服务器具有检测此类情况并将这些线程标记为卡住的预留。有 JMX API 可以杀死这些线程,或者您可以熄火 WAR 以释放线程回到池中。
超时适用于 HTTP 层而不是服务器端。有各种 HTTP 超时,例如:
Servlet 对此毫不知情。当写入已关闭的连接时,您应该看到类似“远程主机关闭连接
”的错误。
想要避免所有这些问题吗?编写一个能够快速处理请求并尽快返回的 Servlet。那将使您的吞吐量保持高水平,并让用户感到满意。