【问题标题】:When does Stateless Session Bean pool initialization happens?无状态会话 Bean 池初始化何时发生?
【发布时间】:2012-11-07 12:15:39
【问题描述】:

在我的应用程序中,我有一个实现为 SLSB 的“工人”池。

我在glassfish-ejb-jar.xml 中定义了一些与池初始化相关的属性,如下所示:

<glassfish-ejb-jar>
    <enterprise-beans>
        <ejb>
            <ejb-name>Worker</ejb-name>
            <jndi-name>Worker</jndi-name>
            <bean-pool>

                <steady-pool-size>10</steady-pool-size>
                <resize-quantity>2</resize-quantity>
                <max-pool-size>30</max-pool-size>
                <pool-idle-timeout-in-seconds>300</pool-idle-timeout-in-seconds>
            </bean-pool>
        </ejb>
    </enterprise-beans>
</glassfish-ejb-jar>

实际上,水池已开始并且尺寸正确。

唯一的一点是初始化不会在启动时发生,而是在一段时间后发生。 这实际上给我带来了一些客户端尝试使用池但发现它未初始化的问题。

有没有办法在启动时触发池初始化,或者这完全留给容器?

【问题讨论】:

    标签: jakarta-ee glassfish-3 ejb-3.1


    【解决方案1】:

    问:有什么方法可以在启动时触发池初始化或者这个 完全留给容器?

    是的。这取决于您使用的 Java EE 版本:

    Java EE 5 (EJB 3.0) 和更早版本 - 使用启动 servlet,即在 web.xml 配置中将参数 load-on-startup 设置为 1 的 servlet。在该 servlet 的 init 方法中,您将实例化您的 Worker bean,一切都将在启动时发生。 servlet 配置示例:

    <servlet>
        <servlet-name>MyStartupServlet></servlet-name>
        <servlet-class>your.package.MyStartupServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    

    Java EE 6 (EJB 3.1) - 将 @Startup 注释与 Singleton bean 一起使用。来自doc

    EJB 容器负责确定何时初始化一个 单例会话 bean 实例,除非单例会话 bean 实现类用 javax.ejb.Startup 注释 注解。在这种情况下,有时称为急切初始化, EJB 容器必须初始化单例会话 bean 应用启动

    【讨论】:

    • 不幸的是,他们不是单身人士。对于一些初始化过程,我实际上有一个注释为 @Startup 的单例,但是这些 bean 必须被池化。
    • 在这种情况下,让 bean 保持原样(SLSB,pooled..)并使用特殊的单例来实例化它们。它们现在可以为您的客户准备好,但请记住,如果它们有一段时间不使用,容器会移除它们。
    【解决方案2】:

    如果我猜问题解决了。 即使我没有找到任何强制池初始化的方法,我注意到只要需要池成员,就会加载整个池。

    这听起来绝对“懒惰”,即使它实际上不会对我的应用程序流造成任何问题,但它确实代表了一个性能问题,因为池中的 bean 非常重。

    【讨论】:

      猜你喜欢
      • 2011-04-26
      • 2010-09-13
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2011-11-05
      相关资源
      最近更新 更多