【问题标题】:Vaadin starts multiple Application instances for single applicationVaadin 为单个应用程序启动多个应用程序实例
【发布时间】:2012-03-26 09:48:50
【问题描述】:

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

这对我来说看起来很不正常,有什么东西会导致这种行为吗?

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

【问题讨论】:

    标签: java tomcat vaadin


    【解决方案1】:

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

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

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

    如果您使用单例模式,请确保使用“在多线程应用程序中构建”下的代码,否则您会在 Tomcat 中遇到奇怪的错误。 JavaWorld上的这篇文章深入讲解:Simply Singleton

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

    【讨论】:

    • Application 是我必须扩展的 Vaadin 类,然后该类用作应用程序的入口点。 init() 方法是我必须覆盖的 Application 类中的抽象方法。 link 是我正在使用的 Threadlocal 模式(带有 HttpServletRequestListener 的模式)
    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 2018-05-29
    • 2011-10-25
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多