servlet容器何时会中断我的线程?

我正在编写一个servlet,它在Java servlet容器中执行(例如,JBoss,Jetty,Tomcat,GlassFish)。

servlet容器中断运行我的HTTP请求处理程序的线程的原因是什么? 它会在关闭时才这样做吗? 当客户端没有响应时会这样做吗?

它是标准化的,还是任何容器都可以按照自己的意愿行事?

为了澄清,我不是在谈论中断我创建的新线程,只是在我的请求运行的servlet容器的线程上。 (虽然如果你在答案中提到新线程会发生什么事情会很有趣)。

servlet容器中断运行我的HTTP请求处理程序的线程的原因是什么?

这取决于容器本身。 它在servlet规范中确实没有标准化。

它会在关闭时才这样做吗?

似乎是最明显的原因之一。 本地测试告诉我,至少Tomcat 7.0.22和Glassfish 3.1.1将立即中止所有servlet的处理,而不让他们继续他们的任务。 此时不会抛出exception。

当客户端没有响应时会这样做吗?

仅当请求标头未完全到达时。 套接字连接上有特定于容器的超时,通常为60秒。 但是如果请求头没有完全到达,那么无论如何都不会输入你的servlet方法。 仅当请求标头完全到达时,才会输入您的servlet方法。

然后,在servlet方法内部; 如果客户端提供了请求主体(例如POST)并且您的servlet代码通过例如request.getParameter()request.getInputStream()开始读取请求主体,那么当客户端中止发送请求主体时它将抛出IOException在那时候。 另一方面,当您写入响应(并刷新/提交它)时,当客户端在该点中止连接时,也会抛出IOException 。 如果有必要,您可以将它放在try-catch ,但除了记录之外,您无法再使用它。 这些日志的有用性非常有问题,可能只会使您的服务器日志混乱。