我尝试将带有一些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?
答案 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版本并使用它是您的最佳选择。