2010-12-12 170 views
0

我有一個Java servlet,它充當部署在同一個Tomcat實例上的其他webservices的外觀。我的包裝servlet創建了更多的線程,每個線程調用Web服務,整理響應並將其發送回客戶端。 Web服務部署在與不同應用程序相同的Tomcat實例上。阻止Tomcat中的線程阻塞

在部署幾個小時之後,我看到此外觀包裝服務上的線程阻塞,這會導致Tomcat實例關閉。所有阻塞的線程是端點到這個門面web服務(如HTTP ://域名/ appContext/facadeService

有沒有辦法控制這些線程阻塞,由於實際做處理可用線程的飢餓?防止這種僵局的最佳做法是什麼?

+1

你需要改進你的回答率。我可以幫助你,但我不想因爲你不願意接受給定的答案而煩惱。 – mindas 2010-12-13 10:05:52

+0

對於我提出的大多數問題,我還沒有找到明確的答案,因此它們仍然是開放的。 – sangupta 2010-12-13 12:24:29

+0

Web服務之間是否存在依賴關係?即webservice1可以調用webservice2,例如? – Joel 2010-12-14 11:24:50

回答

1

該問題的常見解決方案是使用Executor框架。您需要將您的Web服務呼叫表示爲Callable,並將其傳遞給執行程序,或作爲Collection<Callable>(請參閱Javadoc以獲取完整的選項列表)。

您有兩種選擇來控制時間。首先是使用指定最大Web服務超時的Executor類的適當方法的參數。另一種方法是獲取結果(表示爲Future<T>)並使用.get(long, TimeUnit)來指定您可以等待結果的最長時間。

+0

但是使用超時仍然不能解決底層死鎖的原因? – Joel 2010-12-14 11:21:27

+0

對於線程可能被阻塞的原因沒有限制 - 尤其是在沒有給出上下文的情況下。例如,如果使用非線程安全類,則很容易發生死鎖(請參閱SO上的問題1068190)。但一般的建議是使用Executor/Future,因爲您至少可以回收那些無望等待很長時間的線程。 – mindas 2010-12-14 11:29:13

+0

儘管我們沒有在線程上發生超時,但我們已經在使用Executor框架了。 – sangupta 2010-12-15 04:36:00