2012-03-26 133 views
0

我正在查看使用JProfiler在本地tomcat服務器上運行的Vaadin應用程序。這表明每次啓動服務器並運行我的應用程序時,都會有3個主應用程序類的實例。如果我在瀏覽器中關閉應用程序,或者完全關閉瀏覽器,還剩2個。我注意到,應用程序的init()方法在啓動過程中被調用了3次,即使我從來沒有明確地調用它。我正在使用Threadlocal模式(但使用InheritableThreadlocal)。Vaadin爲單個應用程序啓動多個應用程序實例

這對我來說並不正常,有沒有什麼能夠引起這種行爲?

(複製從我的崗位上vaadin論壇這個問題)

回答

1

從你的描述,我推測,Application是你(和Vaadin提供的不是)編寫的一類和你不小心保存的情況下,這個課程在ThreadLocal

這將解釋您看到的行爲:Tomcat將啓動多個線程來處理客戶端請求。對於每個線程,新的Application實例將保存在ThreadLocal中。

嘗試(邪惡)Singleton pattern或(更好)依賴注入與單例作用域相反。

如果使用單例模式,請確保使用「構建在多線程應用程序」下的代碼,否則在Tomcat中會出現奇怪的錯誤。本文就JavaWorld的解釋它在深度:Simply Singleton

編輯根據您的反饋:您看到的是預期的行爲和正確的。 Tomcat使用線程來處理請求,並且它會預先產生一對夫婦以準備開展業務(在你的情況下,它產生三個)。

+0

應用程序是我必須擴展的Vaadin類,然後這個類將作爲應用程序的入口點。 init()方法是Application類中的一個抽象方法,我必須覆蓋它。 [鏈接](https://vaadin.com/wiki//wiki/Main/ThreadLocale+Pattern)是我使用的Threadlocal模式(使用HttpServletRequestListener的模式) – Valyrion 2012-03-26 12:36:48

相關問題