【问题标题】:MDB starts to consume messages before fully initialization of JNDI namesMDB 在完全初始化 JNDI 名称之前开始使用消息
【发布时间】:2017-01-13 16:50:33
【问题描述】:

AS:Websphere 8.5.5

MQ 实现:SIB

在应用程序启动期间MDB开始调用onMessage方法,该方法又调用initialContext.lookup以便找到特定的bean 。 有时(在各种启动迭代期间)它返回 null 而不是对 bean 对象的引用

这种行为是非确定性的:在某些启动迭代中,bean 的上下文有时间进行所有 JNDI 名称 初始化,因为 MDB 初始化 和分别更长消息消费暂停。

是否有任何解决方法或魔法 IBM 密钥 来解决问题?

【问题讨论】:

    标签: jakarta-ee jms websphere ibm-mq message-driven-bean


    【解决方案1】:

    解决此问题的方法之一是使用启动ordering。根据启动顺序,可以依次启动不同的部署应用。在你的情况下,我会确保你想要的 EJB 组件被赋予一个较低的顺序来首先启动它,然后是 MDB,这样查找就永远不会失败

    【讨论】:

    • 感谢您的发帖,但由于架构师的偏好,不允许将 MDB 分离为独立应用程序。我解决了这个问题(但我不能保证这个问题的真正原因),我猜它是非线程安全的 InitialContext。将 InitialContext 作为 INSTANCE VARIABLE 替换为 InitialContext.doLokup() 的静态调用后,问题就消失了。
    【解决方案2】:

    如果您在 MDB 中发生任何其他初始化,考虑 @PostContruct 注释会很有帮助。在初始化完成之前,我也过早触发了 onMessage,导致消息未被处理。将我的附加初始化逻辑放入带有此注释的方法中后,它解决了我的问题。

    @PostConstruct
        public void initialize() {
    ....
    }
    

    【讨论】:

    • 感谢您的回答,很少有条件不允许我使用@Postconstruct(发布我的解决方案)
    【解决方案3】:

    因此,作为每个人都“喜欢”的 Websphere,这无疑是 IBM 的错误。抱歉,我撒谎了....这是同时两个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-23
      • 2021-05-17
      • 2020-12-25
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多