java - 在 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?
解决方案
将我的回复编辑为更正确,并突出显示 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 版本并使用它是您最好的选择。
推荐阅读
- c++ - 为什么 std:string 在比较相同文本的子字符串时不返回 0?
- symfony - 试图调用类的名为“remove”的未定义方法
- r - 在 R 中将推文标记为 ngram
- sql - DBeaver 中的 WHILE 循环给出语法错误
- javascript - 如何修复 chrome 扩展:拒绝运行 JavaScript URL,因为它违反了以下内容安全策略指令:
- node.js - 为什么第一次连接/请求到 MongoDB Atlas 数据库需要这么长时间?
- javascript - 如何使用 useEffect 挂钩从产品中获取类别?
- javascript - Laravel:删除 ID 错误的数据
- html - 轮播指示器处于活动状态
- python - 如何使用 sleep 执行 perf 命令