Java Vaadin为单个应用程序启动多个应用程序实例
我正在看我的Vaadin应用程序,它运行在本地tomcat服务器上,带有JProfiler。这表明,每次启动服务器并运行应用程序时,我的主应用程序类都有3个实例。如果我在浏览器中关闭应用程序,甚至完全关闭浏览器,则剩下2个。我注意到应用程序的init()方法在启动时被调用了3次,尽管我自己从来没有显式地调用过它。我使用的是Threadlocal模式(但使用的是InheritableThreadlocal) 这在我看来不正常,有什么能导致这种行为吗Java Vaadin为单个应用程序启动多个应用程序实例,java,tomcat,vaadin,Java,Tomcat,Vaadin,我正在看我的Vaadin应用程序,它运行在本地tomcat服务器上,带有JProfiler。这表明,每次启动服务器并运行应用程序时,我的主应用程序类都有3个实例。如果我在浏览器中关闭应用程序,甚至完全关闭浏览器,则剩下2个。我注意到应用程序的init()方法在启动时被调用了3次,尽管我自己从来没有显式地调用过它。我使用的是Threadlocal模式(但使用的是InheritableThreadlocal) 这在我看来不正常,有什么能导致这种行为吗 (从我在vaadin论坛上的帖子中复制了这个问题
(从我在vaadin论坛上的帖子中复制了这个问题)根据您的描述,我推断
应用程序
是您编写的类(而不是vaadin提供的东西),并且您以某种方式将此类实例保存在ThreadLocal
中
这将解释您看到的行为:Tomcat将启动几个线程来处理客户端请求。对于每个线程,一个新的应用程序
实例将保存在ThreadLocal
中
用单例作用域尝试(邪恶的)或(更好的)依赖注入
如果使用单例模式,请确保使用“多线程应用程序中的构造”下的代码,否则在Tomcat中会出现奇怪的错误。这篇关于JavaWorld的文章对其进行了深入的解释:
根据您的反馈进行编辑:您看到的行为符合预期且正确。Tomcat使用线程来处理请求,它将预先生成一对线程以准备业务(在您的情况下,它会生成三个线程)。应用程序是一个我必须扩展的Vaadin类,然后该类将作为应用程序的入口点。init()方法是我必须覆盖的应用程序类中的一个抽象方法。是我正在使用的Threadlocal模式(带有HttpServletRequestListener的模式)