我正在编写一个 servlet,它在 Java servlet 容器(例如,JBoss、Jetty、Tomcat、GlassFish)中执行。
servlet 容器中断运行我的 HTTP 请求处理程序的线程的原因是什么?它只会在关闭时这样做吗?当客户端没有响应时它会这样做吗?
是标准化的,还是任何容器都可以自由的为所欲为?
澄清一下,我不是在谈论中断我创建的新线程,只是在运行我的请求的 servlet 容器线程上。 (尽管如果您在答案中提到新线程会发生什么情况会很有趣)。
最佳答案
What are the reasons for a servlet container to interrupt the thread running my HTTP request handler?
这取决于容器本身。在servlet规范中确实没有标准化。
Will it do that only when shutting down?
似乎是最明显的原因之一。本地测试告诉我,至少 Tomcat 7.0.22 和 Glassfish 3.1.1 将立即中止所有 servlet 的处理,而不让它们继续执行任务。此时不会抛出任何异常。
Will it do that when the client is not responding?
仅当请求头未完全到达时。套接字连接上有一个特定于容器的超时,通常为 60 秒。但是如果request headers没有完全到达,那么你的servlet method无论如何也不会进入。只有当请求 header 完全到达时,才会进入您的 servlet 方法。
然后,在servlet方法内部;如果客户端提供了请求主体(例如 POST)并且您的 servlet 代码开始通过例如 request.getParameter()
或 request.getInputStream()
读取请求主体,然后当客户端在此时中止发送请求主体时,它将抛出 IOException
。另一方面,当您写入响应(并刷新/提交它)时,当客户端在此时中止连接时,也会抛出 IOException
。如果需要,您可以将它放在 try-catch
中,但除了记录之外,您不能用它做任何事情。这些日志记录的有用性非常值得怀疑,并且可能只会使您的服务器日志困惑。
关于java - servlet 容器何时会中断我的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7919717/