无状态会话Bean池初始化何时发生?

时间:2012-11-07 12:15:40

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

在我的应用程序中,我有一个以“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>

实际上游泳池开始并且尺寸正确。

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

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

2 个答案:

答案 0 :(得分:2)

  

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

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

Java EE 5(EJB 3.0)及更早版本 - 使用启动servlet,即在load-on-startup配置中将参数web.xml设置为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) - 对Singleton bean使用@Startup注释。来自doc

  

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

答案 1 :(得分:0)

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

这听起来确实“懒惰”,即使它实际上不会对我的应用程序的流程造成任何问题,它最终代表性能问题,因为汇集的bean非常重。