Vaadin为单个应用程序启动多个应用程序实例

问题描述:

我正在查看使用JProfiler在本地tomcat服务器上运行的Vaadin应用程序。这表明每次启动服务器并运行我的应用程序时,都会有3个主应用程序类的实例。如果我在浏览器中关闭应用程序,或者完全关闭浏览器,还剩2个。我注意到,应用程序的init()方法在启动过程中被调用了3次,即使我从来没有明确地调用它。我正在使用Threadlocal模式(但使用InheritableThreadlocal)。Vaadin为单个应用程序启动多个应用程序实例

这对我来说并不正常,有没有什么能够引起这种行为?

(复制从我的岗位上vaadin论坛这个问题)

从你的描述,我推测,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