Multithreading 防止Tomcat中的线程阻塞
我有一个Javaservlet,它充当部署在同一Tomcat实例上的其他Web服务的门面。我的包装器servlet创建更多线程,每个线程调用一个Web服务,整理响应并将其发送回客户端。这些Web服务作为不同的应用程序部署在同一个Tomcat实例上 在部署了几个小时之后,我看到这个facade包装器服务上出现了线程阻塞,这导致Tomcat实例崩溃。所有被阻止的线程都是此facade Web服务的端点(如http://domain/appContext/facadeService)Multithreading 防止Tomcat中的线程阻塞,multithreading,web-services,tomcat,thread-safety,Multithreading,Web Services,Tomcat,Thread Safety,我有一个Javaservlet,它充当部署在同一Tomcat实例上的其他Web服务的门面。我的包装器servlet创建更多线程,每个线程调用一个Web服务,整理响应并将其发送回客户端。这些Web服务作为不同的应用程序部署在同一个Tomcat实例上 在部署了几个小时之后,我看到这个facade包装器服务上出现了线程阻塞,这导致Tomcat实例崩溃。所有被阻止的线程都是此facade Web服务的端点(如http://domain/appContext/facadeService) 由于实际执行处理
由于实际执行处理的可用线程不足,有没有办法控制这种线程阻塞?防止此类死锁的最佳做法是什么?解决此问题的常见方法是使用框架。您需要将web服务调用表示为
Callable
,并将其传递给执行者,或者作为集合进行传递(有关完整的选项列表,请参阅Javadoc)
你有两种选择来控制时间。首先是使用Executor
类的适当方法的参数,在该类中指定最大web服务超时。另一个选项是获取结果(表示为Future
),并使用.get(long,TimeUnit)
指定等待结果的最长时间。您需要提高回答率。我可以帮助你,但我只是不想,因为你不愿意接受给定的答案。对于我提出的大多数问题,我还没有找到一个明确的答案,因此,它们仍然是开放的。Web服务之间是否存在任何依赖关系?i、 例如,webservice1可以调用webservice2吗?子服务是互斥的。但是使用超时仍然不能解决底层死锁的原因?线程被阻塞的原因没有限制,特别是在没有提供上下文的情况下。例如,如果使用非线程安全的类,很容易出现死锁(请参见问题1068190)。但是一般的建议是使用Executor/Future,因为您至少可以回收那些等待了很长时间的线程。我们已经在使用Executor框架,尽管线程没有超时。