我正在查看使用JProfiler在本地tomcat服务器上运行的我的Vaadin应用程序。这表明每次启动服务器并运行我的应用程序时,我的主Application类都有3个实例。如果我在浏览器中关闭应用程序甚至完全关闭浏览器,则剩下2个。我注意到应用程序的init()方法在启动期间被调用了3次,即使我从未明确地自己调用它。我正在使用Threadlocal模式(但使用InheritableThreadlocal)。
对我来说这看起来不正常,有什么可以导致这种行为吗?
(从我在vaadin论坛上的帖子中复制了这个问题)
答案 0 :(得分:1)
根据您的描述,我认为Application
是您编写的类(而不是Vaadin提供的类),并且您以某种方式将此类的实例保存在ThreadLocal
中。
这可以解释您所看到的行为:Tomcat将启动多个线程来处理客户端请求。对于每个线程,新的Application
实例将保存在ThreadLocal
。
尝试使用单例范围(邪恶)Singleton pattern或(更好)依赖注入。
如果使用单例模式,请确保使用“在多线程应用程序中构造”下的代码,否则您将在Tomcat中出现奇怪的错误。这篇关于JavaWorld的文章深入解释了它:Simply Singleton
编辑根据您的反馈:您看到的行为是正确的。 Tomcat使用线程来处理请求,它会预先生成一对来为业务做好准备(在你的情况下,它会生成三个)。