我正在编写一个servlet,它在Java servlet 容器(例如JBoss、Jetty、Tomcat、GlassFish)中执行。
servlet 容器中断运行我的 HTTP 请求处理程序的线程的原因是什么?只有在关闭时才会这样做吗?当客户没有响应时它会这样做吗?
它是标准化的,还是任何容器都可以自由地做他想做的事?
为了澄清,我不是在谈论中断我创建的新线程,而是在我的请求正在运行的 servlet 容器的线程上。 (尽管如果您在答案中提到新线程会发生什么,那会很有趣)。
servlet 容器中断运行我的 HTTP 请求处理程序的线程的原因是什么?
这取决于容器本身。 servlet 规范中确实没有标准化。
只有在关闭时才会这样做吗?
似乎是最明显的原因之一。本地测试告诉我,至少 Tomcat 7.0.22 和 Glassfish 3.1.1 会立即中止所有 servlet 的处理,而不让它们继续执行任务。此时不会抛出任何异常。
当客户没有响应时它会这样做吗?
仅当请求标头未完全到达时。套接字连接有特定于容器的超时,通常为 60 秒。但是如果请求标头没有完全到达,那么您的 servlet 方法无论如何都不会被输入。只有当请求标头完全到达时,才会进入您的 servlet 方法。
然后,在servlet方法内部;如果客户端提供了请求正文(例如 POST)并且您的 servlet 代码开始读取请求正文,例如request.getParameter()
or request.getInputStream()
,然后它会抛出IOException
当客户端此时中止发送请求正文时。另一方面,当您写入响应(并刷新/提交它)时,也会有一个IOException
当客户端此时中止连接时将抛出该异常。如有必要,您可以将其放入try-catch
,但除了记录之外你不能用它做任何其他事情。这些日志记录的有用性非常值得怀疑,并且可能只会使您的服务器日志变得混乱。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)