MDB 在完全初始化 JNDI 名称之前开始使用消息
MDB starts to consume messages before fully initialization of JNDI names
AS: Websphere 8.5.5
MQ 实现:SIB
在应用程序启动期间 MDB 开始调用 onMessage 方法,后者又调用 initialContext.lookup 以便 找到特定的 bean。
有时(在各种启动迭代期间)它 returns null 而不是对 bean 对象的引用 .
此行为是不确定的:在某些启动迭代中,由于更长[=25],bean 的上下文有时间进行所有JNDI 名称 初始化=]MDB 初始化 和消息消费暂停。
是否有任何变通方法或魔法 IBM 密钥 来解决问题?
解决此问题的方法之一是使用启动 ordering。根据启动顺序,可以依次启动不同部署的应用程序。在你的情况下,我会确保你想要的 EJB 组件被赋予一个较低的序列来首先启动它,然后是 MDB,这样查找就永远不会失败
如果您在 MDB 内部进行了任何额外的初始化,考虑 @PostContruct
注释会很有帮助。在初始化完成之前,我也过早触发了 onMessage,导致消息未被处理。将我的额外初始化逻辑放入带有此注释的方法中后,它解决了我的问题。
@PostConstruct
public void initialize() {
....
}
因此,正如大家 "love's" Websphere 一样,这无疑是一个 IBM 错误。抱歉,我撒谎了....同时有 两个 个错误。
- 首先:
http://www-01.ibm.com/support/docview.wss?uid=swg1PI28099。
是的,你需要自己修复这个错误!!!
只需将此 jvm 自定义 属性 添加到您的服务器:
com.ibm.ejs.j2c.J2CServerListener.activateEndpointsOnCRAStarted = true
- 第二个:
http://www-01.ibm.com/support/docview.wss?uid=swg1PM62774
是的,这个你也需要自己修理......鼓声......自己!!!
只需将第二个自定义 属性 添加到您的服务器:
com.ibm.ws.cdi.immediate.ejb.start = 真
AS: Websphere 8.5.5
MQ 实现:SIB
在应用程序启动期间 MDB 开始调用 onMessage 方法,后者又调用 initialContext.lookup 以便 找到特定的 bean。 有时(在各种启动迭代期间)它 returns null 而不是对 bean 对象的引用 .
此行为是不确定的:在某些启动迭代中,由于更长[=25],bean 的上下文有时间进行所有JNDI 名称 初始化=]MDB 初始化 和消息消费暂停。
是否有任何变通方法或魔法 IBM 密钥 来解决问题?
解决此问题的方法之一是使用启动 ordering。根据启动顺序,可以依次启动不同部署的应用程序。在你的情况下,我会确保你想要的 EJB 组件被赋予一个较低的序列来首先启动它,然后是 MDB,这样查找就永远不会失败
如果您在 MDB 内部进行了任何额外的初始化,考虑 @PostContruct
注释会很有帮助。在初始化完成之前,我也过早触发了 onMessage,导致消息未被处理。将我的额外初始化逻辑放入带有此注释的方法中后,它解决了我的问题。
@PostConstruct
public void initialize() {
....
}
因此,正如大家 "love's" Websphere 一样,这无疑是一个 IBM 错误。抱歉,我撒谎了....同时有 两个 个错误。
- 首先: http://www-01.ibm.com/support/docview.wss?uid=swg1PI28099。 是的,你需要自己修复这个错误!!! 只需将此 jvm 自定义 属性 添加到您的服务器: com.ibm.ejs.j2c.J2CServerListener.activateEndpointsOnCRAStarted = true
- 第二个: http://www-01.ibm.com/support/docview.wss?uid=swg1PM62774 是的,这个你也需要自己修理......鼓声......自己!!! 只需将第二个自定义 属性 添加到您的服务器: com.ibm.ws.cdi.immediate.ejb.start = 真