servlet容器什么时候会中断我的线程?

Chi*_*Lan 6 java servlets

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

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

它是标准化的,还是任何容器可以自由地做他想做的事情?

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

Bal*_*usC 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当客户端在此时中止连接时,也会抛出一个异常。如果需要,您可以将其放入 a 中try-catch,但除了记录之外您不能用它做任何其他事情。这些日志记录的有用性非常值得怀疑,并且可能只会使您的服务器日志变得混乱。