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

时间:2012-03-26 09:48:51

标签: java tomcat vaadin

我正在查看使用JProfiler在本地tomcat服务器上运行的我的Vaadin应用程序。这表明每次启动服务器并运行我的应用程序时,我的主Application类都有3个实例。如果我在浏览器中关闭应用程序甚至完全关闭浏览器,则剩下2个。我注意到应用程序的init()方法在启动期间被调用了3次,即使我从未明确地自己调用它。我正在使用Threadlocal模式(但使用InheritableThreadlocal)。

对我来说这看起来不正常,有什么可以导致这种行为吗?

(从我在vaadin论坛上的帖子中复制了这个问题)

1 个答案:

答案 0 :(得分:1)

根据您的描述,我认为Application是您编写的类(而不是Vaadin提供的类),并且您以某种方式将此类的实例保存在ThreadLocal中。

这可以解释您所看到的行为:Tomcat将启动多个线程来处理客户端请求。对于每个线程,新的Application实例将保存在ThreadLocal

尝试使用单例范围(邪恶)Singleton pattern或(更好)依赖注入。

如果使用单例模式,请确保使用“在多线程应用程序中构造”下的代码,否则您将在Tomcat中出现奇怪的错误。这篇关于JavaWorld的文章深入解释了它:Simply Singleton

编辑根据您的反馈:您看到的行为是正确的。 Tomcat使用线程来处理请求,它会预先生成一对来为业务做好准备(在你的情况下,它会生成三个)。