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



Tomcat 6/7:

1)假设在请求线程中我们执行一些任务;调用其他web服务,数据库等。当客户端关闭HTTP连接时,请求线程是否被终止/杀死,从而停止任何正在运行的任务?如果没有,如何终止?

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

a.),线程继续运行。当/如果它最终返回一些东西时,它将失败并产生套接字异常,因为它试图写入的连接已经关闭。在普通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容器不会为您做这些。

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新