java - servlet 容器何时会中断我的线程?

标签 java servlets

我正在编写一个 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/

相关文章:

java - Servlet response.sendRedirect 编码问题

javascript - Servlet 对 Javascript 的响应以纯文本形式显示在浏览器上

java - Java 新手请help.form n servlet

java - 正则表达式在 zul -ZK 中不起作用

java - @Conditional 不适用于继承的类?

java - 无法从 archetype-catalog.xml 创建项目

java - Java-ExecutorService : How to re run “wait state” thread

java - ActionPerformed 自执行

java - Tomcat的授权代码/类在哪里?

java - Servlet 加载属性文件