我有一个Java servlet,它充当在同一个Tomcat实例上部署的其他Web服务的外观。我的包装器servlet创建了 N 个更多线程,每个线程调用一个web服务,整理响应并将其发送回客户端。 Web服务部署在与不同应用程序相同的Tomcat实例上。
我在部署几个小时后看到了这个Facade包装器服务上的线程阻塞,这导致了Tomcat实例的崩溃。所有被阻止的线程都是此Facade webservice的端点(如 http:// domain / appContext / facadeService )
有没有办法控制这种线程阻塞,因为实际进行处理的可用线程不足?防止此类死锁的最佳做法是什么?
答案 0 :(得分:1)
此问题的常见解决方案是使用Executor框架。您需要将您的Web服务调用表达为Callable
并将其传递给执行程序,或者作为Collection<Callable>
(请参阅Javadoc以获取完整的选项列表)。
您有两种选择来控制时间。首先是使用Executor
类的适当方法的参数,您可以在其中指定最大Web服务超时。另一个选择是获取结果(表示为Future<T>
)并使用.get(long, TimeUnit)
指定等待结果的最长时间。