2012-11-21 86 views
0

我有一個Web應用程序,它在內部啓動服務器套接字並偵聽傳入的消息。當我取消部署我的web應用程序時,它也會停止tomcat服務器。Tomcat服務停止在undeplyment

我可以知道是否有任何需要更新的設置來處理這種情況?

我的環境:目前我正在使用來自安裝的默認設置。我的tomcat的版本是 「的Apache Tomcat/7.0.10」,JVM版本是 「1.6.0_24-B24」,OS我使用的是 「Linux的」 在服務器日誌

錯誤顯示

重度: Web應用程序[/ sampleApp]似乎已經啓動了一個名爲[Thread-4]的線程,但未能阻止它。這很可能造成內存泄漏。

+0

嗯,Tomcat對錯誤非常明確。 「取消部署」時停止您的應用程序線程。 –

回答

1

不知道爲什麼取消部署該應用程序會導致Tomcat本身停止,可能會更多地查看日誌並提高日誌級別。然而,你在Tomcat中創建一個服務器套接字的方法很奇怪(我質疑爲什麼如果它實現它自己的套接字協議而不是HTTP,它首先需要在一個web應用程序中)。

Servlet API明確建議不要在處理HTTP Servlet請求時創建新線程。 Tomcat跟蹤與每個webapp相關的線程池和資源,當你創建一個新的線程時,你將有效地脫離它的模型,這就是創建這個錯誤的原因。當您的ServerSocket獲得新的客戶端連接並初始化新的Thread來處理它時,最有可能發生這種情況。

如果您需要實現任何多線程,它應該在ContextListener中,當webapp加載時它會被初始化。如果servlet需要將任何工作卸載到其他線程,則servlet會與之通信。切勿直接從Servlet創建新線程。您也可以將ServerSocket置於ContextListener中,但是您可能想重新考慮爲什麼要處理自己的協議和HTTP(可能使用Jetty對您的情況更有意義?)

+0

很好解釋.. – Mohsin