在 Websphere Application Server 上启动应用程序时未调用 MDB 的 ejbCreate() 方法
ejbCreate() method of MDB not called at the application startup on Websphere Application Server
我尝试在 Websphere Application Server v7.0.0.23 上部署一个基于 EJB 2.1 的应用程序,并在 MDB 的 onEjbCreate 方法中使用一些 Spring 初始化代码:
@Override
protected void onEjbCreate() {
getBeanFactory().getBean("myBean");
}
但是这个方法是在收到消息时调用的,而不是在应用程序启动时调用的。我如何强制 WAS 在消息接收之前实例化我的 MDB?
编辑我的回复以使其更正确并突出显示 Tracy 提到的信息:
默认情况下,EJBContainer 会推迟初始化 bean,直到它们被首次调用。此外,每次创建新 bean 时都会调用 ejbCreate()。 MDB 实例只有在关系资源适配器 (RAR) 请求时才会创建;通常在传递消息时。因为,每个实例的 ejbCreate 运行s,所以如果 RAR 要求说 50,那么 ejbCreate 将被调用 50 次。
您可以通过编程方式查找 bean 并在它收到消息以触发您的初始化代码之前以某种方式创建它,但您可能不希望每次创建 bean 时都运行您的初始化代码,所以最好的选择是使用启动 bean。由于您使用的是 EJB2.1 bean 并且 Was7 EJB 容器有一个 'legacy' 启动 bean
在 EJB3.0 Startup Singleton bean 中引入了可以通过使用 @Singleton
@Startup
注释 class 或使用 ejb-[=25= 在单个 bean 上配置来添加的] 文件:
<session name="[bean-name]">
<start-at-app-start value="true"/>
</session>
升级 WAS/EJB 版本并使用它是您最好的选择。
我尝试在 Websphere Application Server v7.0.0.23 上部署一个基于 EJB 2.1 的应用程序,并在 MDB 的 onEjbCreate 方法中使用一些 Spring 初始化代码:
@Override
protected void onEjbCreate() {
getBeanFactory().getBean("myBean");
}
但是这个方法是在收到消息时调用的,而不是在应用程序启动时调用的。我如何强制 WAS 在消息接收之前实例化我的 MDB?
编辑我的回复以使其更正确并突出显示 Tracy 提到的信息:
默认情况下,EJBContainer 会推迟初始化 bean,直到它们被首次调用。此外,每次创建新 bean 时都会调用 ejbCreate()。 MDB 实例只有在关系资源适配器 (RAR) 请求时才会创建;通常在传递消息时。因为,每个实例的 ejbCreate 运行s,所以如果 RAR 要求说 50,那么 ejbCreate 将被调用 50 次。
您可以通过编程方式查找 bean 并在它收到消息以触发您的初始化代码之前以某种方式创建它,但您可能不希望每次创建 bean 时都运行您的初始化代码,所以最好的选择是使用启动 bean。由于您使用的是 EJB2.1 bean 并且 Was7 EJB 容器有一个 'legacy' 启动 bean
在 EJB3.0 Startup Singleton bean 中引入了可以通过使用 @Singleton
@Startup
注释 class 或使用 ejb-[=25= 在单个 bean 上配置来添加的] 文件:
<session name="[bean-name]">
<start-at-app-start value="true"/>
</session>
升级 WAS/EJB 版本并使用它是您最好的选择。