防止Tomcat中的线程阻塞

时间:2010-12-12 17:36:48

标签: multithreading web-services tomcat thread-safety

我有一个Java servlet,它充当在同一个Tomcat实例上部署的其他Web服务的外观。我的包装器servlet创建了 N 个更多线程,每个线程调用一个web服务,整理响应并将其发送回客户端。 Web服务部署在与不同应用程序相同的Tomcat实例上。

我在部署几个小时后看到了这个Facade包装器服务上的线程阻塞,这导致了Tomcat实例的崩溃。所有被阻止的线程都是此Facade webservice的端点(如 http:// domain / appContext / facadeService

有没有办法控制这种线程阻塞,因为实际进行处理的可用线程不足?防止此类死锁的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

此问题的常见解决方案是使用Executor框架。您需要将您的Web服务调用表达为Callable并将其传递给执行程序,或者作为Collection<Callable>(请参阅Javadoc以获取完整的选项列表)。

您有两种选择来控制时间。首先是使用Executor类的适当方法的参数,您可以在其中指定最大Web服务超时。另一个选择是获取结果(表示为Future<T>)并使用.get(long, TimeUnit)指定等待结果的最长时间。