Websphere Application Server上的应用程序启动时未调用MDB的ejbCreate()方法

时间:2018-12-12 17:06:30

标签: java java-ee websphere ejb-2.x

我尝试将带有一些Spring初始化代码的基于EJB 2.1的应用程序部署到Websphere Application Server v7.0.0.23上,并将其放入MDB的onEjbCreate方法中:

import random, math

def poisson(rate):
     t = 0
     count = 0
     while t < 1:
          t -= math.log(random.random())/rate
          count += 1
     return count - 1

但是在接收消息时而不是在应用程序启动时调用此方法。我如何强制WAS在接收消息之前实例化我的MDB?

1 个答案:

答案 0 :(得分:0)

编辑我的回答以使其更正确,并突出显示Tracy提到的信息:

默认情况下,EJBContainer推迟初始化bean,直到首次调用它们为止。此外,每次创建新bean时都会调用ejbCreate()。在关系资源适配器(RAR)要求一个实例之前,不会创建MDB实例。通常在传递邮件时。由于ejbCreate会在每个实例上运行,因此如果RAR要求输入50,则ejbCreate将被调用50次。

您可以以编程方式查找Bean并以某种方式创建它,然后它会收到一条消息来触发您的初始化代码,但是您可能不想每次都创建一个Bean时都运行初始化代码,因此最好的选择是使用启动Bean。由于您使用的是EJB2.1 Bean,而Was7 EJB容器具有“旧式”启动Bean

在EJB3.0启动中,引入了Singleton bean,可以通过用@Singleton @Startup注释类来添加,也可以使用ejb-jar.xml文件在单个bean上进行配置:

<session name="[bean-name]">
    <start-at-app-start value="true"/>
</session>

提高WAS / EJB版本并使用它是您的最佳选择。