首页 > 解决方案 > 在 Websphere Application Server 上的应用程序启动时未调用 MDB 的 ejbCreate() 方法

问题描述

我尝试在 Websphere Application Server v7.0.0.23 上部署一个基于 EJB 2.1 的应用程序,并在 MDB 的 onEjbCreate 方法中使用一些 Spring 初始化代码:

@Override
protected void onEjbCreate() {      
    getBeanFactory().getBean("myBean");     
}

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

标签: javajakarta-eewebsphereejb-2.x

解决方案


将我的回复编辑为更正确,并突出显示 Tracy 提到的信息:

默认情况下,EJBContainer 推迟初始化 bean,直到它们第一次被调用。此外,每次创建新 bean 时都会调用 ejbCreate()。直到关系资源适配器 (RAR) 要求创建 MDB 实例;通常在传递消息时。因为,ejbCreate 为每个实例运行,所以如果 RAR 要求说 50,那么 ejbCreate 将被调用 50 次。

您可以在接收到触发初始化代码的消息之前以编程方式查找 bean 并以某种方式创建它,但是您可能不想在每次创建 bean 时都运行初始化代码,所以最好的选择是使用启动豆。由于您使用的是 EJB2.1 bean 并且 Was7 EJB Container 有一个“旧版”启动 bean

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

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

升级 WAS/EJB 版本并使用它是您最好的选择。


推荐阅读