Tomcat:在HTTP连接关闭时终止在请求线程内生成的线程

时间:2015-05-21 01:01:57

标签: java multithreading tomcat threadpool tomcat6

在Tomcat 6/7中:

1)在请求线程中说我们执行一些任务;调用其他Web服务,DB..etc。当客户端关闭HTTP连接时,请求线程是否被终止/终止停止任何正在运行的任务?如果没有,如何终止?

2)如果在请求线程中我们执行一些并行任务会产生一些新线程(使用具有固定池大小的ExecutorService)。在HTTP连接关闭的情况下,如何终止/终止这些线程在这里产生请求线程?

2 个答案:

答案 0 :(得分:2)

a。)线程一直在运行。当/它最终返回soemthing时,它将因套接字异常而失败,因为它尝试写入的连接已经关闭。在普通的servlet api中,当连接关闭时,你无法告诉线程。

b。)如果你产生额外的线程,一个简单的观察方法是使用java并发包中的Callables和Futures。这为您提供了一种处理超时的便捷方式。查看此处的文档:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html

在这里:

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Callable.html

无论如何,你将负责观察线程,并确保它们不会永远运行,你的servlet容器不会为你做。

答案 1 :(得分:1)

Tomcat有一个名为minSpareThreads的属性。除非在minSpareThreads中,否则未使用的线程将被销毁。

  

minSpareThreads
  最小线程数始终保持运行。如果未指定,则使用默认值10。

在HTTP连接关闭的情况下,如何终止/终止在请求线程中产生的这些线程?

有多种方法可以做到这一点。首先要注意的是,在正常的Tomcat使用情况下,Servlet处理请求时,您不会收到有关连接关闭的通知。但是,如果Tomcat将其视为错误并向您发送该链接中提到的CometEvent(需要进一步测试),则Tomcat确实可以使用advanced IO features拦截连接关闭。

所以现在让我们说你要么等待线程完成(超时),要么通过某种方式得到连接关闭通知,然后你必须中断你的工作线程(你试图停止)。这通常分两步完成。 1)将共享的原子或易失性布尔对象设置为描述“停止处理”的值,这是一种控制标志。 2)然后中断你的线程。工作线程应该突破任何阻塞方法,然后可以检查共享变量(控制标志)是否设置为“停止”。如果您的工作线程在一些代码的一次迭代后自然停止,则可以跳过步骤1。一些线程保持循环,直到其控制标志设置为“停止”。如果您正在使用ExecutorService,那么其shutdownNow方法通常会将Thread.interrupt发送到其池中运行的所有线程。