Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Vaadin为单个应用程序启动多个应用程序实例_Java_Tomcat_Vaadin - Fatal编程技术网

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

Java Vaadin为单个应用程序启动多个应用程序实例,java,tomcat,vaadin,Java,Tomcat,Vaadin,我正在看我的Vaadin应用程序,它运行在本地tomcat服务器上,带有JProfiler。这表明,每次启动服务器并运行应用程序时,我的主应用程序类都有3个实例。如果我在浏览器中关闭应用程序,甚至完全关闭浏览器,则剩下2个。我注意到应用程序的init()方法在启动时被调用了3次,尽管我自己从来没有显式地调用过它。我使用的是Threadlocal模式(但使用的是InheritableThreadlocal) 这在我看来不正常,有什么能导致这种行为吗 (从我在vaadin论坛上的帖子中复制了这个问题

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

这在我看来不正常,有什么能导致这种行为吗


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

根据您的描述,我推断
应用程序
是您编写的类(而不是vaadin提供的东西),并且您以某种方式将此类实例保存在
ThreadLocal

这将解释您看到的行为:Tomcat将启动几个线程来处理客户端请求。对于每个线程,一个新的
应用程序
实例将保存在
ThreadLocal

用单例作用域尝试(邪恶的)或(更好的)依赖注入

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


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

应用程序是一个我必须扩展的Vaadin类,然后该类将作为应用程序的入口点。init()方法是我必须覆盖的应用程序类中的一个抽象方法。是我正在使用的Threadlocal模式(带有HttpServletRequestListener的模式)