我正在编写一个servlet,它在Java servlet容器中执行(例如,JBoss,Jetty,Tomcat,GlassFish)。
servlet容器中断运行HTTP请求处理程序的线程的原因是什么?它只会在关闭时才这样做吗?当客户端没有响应时会这样做吗?
它是标准化的,还是任何容器都可以按照自己的意愿行事?
为了澄清,我不是在谈论中断我创建的新线程,只是在我的请求正在运行的servlet容器的线程上。 (虽然如果你在答案中提到新线程会发生什么事情会很有趣。)
答案 0 :(得分:1)
servlet容器中断运行HTTP请求处理程序的线程的原因是什么?
这取决于容器本身。它在servlet规范中确实没有标准化。
只有在关闭时才会这样做吗?
似乎是最明显的原因之一。本地测试告诉我,至少Tomcat 7.0.22和Glassfish 3.1.1将立即中止所有servlet的处理,而不让他们继续他们的任务。此时不会抛出异常。
当客户端没有响应时会这样做吗?
仅当请求标头未完全到达时。套接字连接上有特定于容器的超时,通常为60秒。但是如果请求头没有完全到达,那么无论如何都不会输入你的servlet方法。只有在请求标头完全到达时,才会输入您的servlet方法。
然后,在servlet方法中;如果客户端提供了请求主体(例如POST)并且您的servlet代码开始通过例如request.getParameter()
或request.getInputStream()
读取请求正文,则当客户端中止时它将抛出IOException
在那时发送请求正文。另一方面,当您写入响应(并刷新/提交它)时,当客户端在该点中止连接时,也会抛出IOException
。您可以根据需要将其放在try-catch
中,但除了记录之外,您无法再使用它。这些日志的有用性非常有问题,可能只会使您的服务器日志变得混乱。