2011-10-27 84 views
6

我正在写一个servlet,它是在Java servlet容器(例如,JBoss,Jetty,Tomcat,GlassFish)中执行的。什么时候servlet容器会中断我的线程?

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

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

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

+1

为了避免模棱两可,当你说“线程”时,你真的*表示“HTTP请求”吗? – BalusC

+0

好吧,从技术上讲,它会中断我的线程,并且当线程碰巧运行我的HTTP请求时它会发生。所以我不确定如何写它。换句话说,希望它更好。 –

+0

如果您自己产生线程,场景会非常不同。所以你需要更清楚你的意思是什么线程,它是如何创建的,以及它是否是一个守护线程,等等。 – BalusC

回答

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中,但是除了记录之外,你不能再做任何事情。这些日志记录的用处非常可疑,并且可能只会使服务器日志变得混乱。

+0

所以基本上,我可以忽略Servlet代码中的InterruptedException,因为它永远不会发生? –

+0

是的。更重要的是,只有在您自己创建和管理线程的情况下,才能捕捉到它。 – BalusC

+0

我可以用'process.waitFor()'抛出它来捕捉它。 –

相关问题