代码之家  ›  专栏  ›  技术社区  ›  Kimi Wu

ActiveMQ-挂起发送方法

  •  0
  • Kimi Wu  · 技术社区  · 12 年前

    我使用的是AcitveMQ 5.3。我不知道为什么我的客户端挂起了(MessageProducer的)send方法。

    这是我的情况, 我有一台服务器(带有MQ代理),并将服务器从1.0升级到2.0(MQ代理也从5.3升级到5.6)。 同时,由于MQ代理重新启动,客户端收到一个“中断”通知和一个“恢复”通知。在“简历”中,我将客户端状态发送到服务器,服务器挂起。

    我有10个客户,其中两个有上述情况。在向MQ代理发送消息时,我已尝试重新启动该代理。(与上述情况类似。)然而,很难重现。

    有人有过这样的经历吗?挂起MessageProducer方法的发送?

    谢谢


    更新: 以下是步骤,

    1. 经纪人和客户的版本是5.3

    2. 卸载代理并安装5.6代理。

      ===>正如您所说,经纪人和客户之间的版本不匹配。版本不匹配会导致问题吗?但它应该具有向后兼容性,对吧?

    3. 我将获得TransportListener的Interrupted和Resume方法

    4. 我执行一些连接恢复任务,并在Resume调用中向代理发送消息

      ===>正如您所提到的,在Resume呼叫中发送消息是很危险的。然而,我们一直在这样做,以前从未遇到过这种问题。

    5. 我的程序将挂在MessageProducer发送中。

    这更清楚吗?代码到处都是分开的,发布它并不容易。

    谢谢


    更新部分2,

    我将MessageProducer发送移动到另一个线程,但在TransportListener的Resume回调中等待,直到发送完成。在这种情况下,它总是挂起发送消息。然而,“在Resume回调中直接发送消息”偶尔会挂起。这两种情况非常相似。为什么它们如此不同?我深入研究了源代码(ActiveMQ Cpp 3.4.5),但没有发现任何特别的东西。还是我挖错了文件?我真的很想知道它的机理。

    顺便说一句,在“更新第二部分”之前,我使用的是java版本MQ。但结果似乎在java和cpp之间没有区别。因此,在“更新第2部分”中,我使用ActiveMQ CPP 3.4.5作为我的库。

    谢谢

    1 回复  |  直到 12 年前
        1
  •  0
  •   Tim Bish    12 年前

    这有点不清楚你的设置是什么,客户端和代理版本是否匹配?如果没有,那么问题很可能与此有关。

    一些代码在这里会有所帮助。但我认为您要说的是,您在TransportListener方法resumed()调用期间向broker发送了一条消息。这可能很危险,因为你从同一个线程循环回传输层,这通常会导致问题,因为这些事件实际上不是你发送消息等的地方,而是一个更新点,它可以让你启动一个新的线程或活动来处理连接恢复。

    在Producer流控制启动的情况下,也可以触发挂起MessageProducer发送,但我不相信这种情况会在您的情况下发生,但如果不进一步澄清您的问题,这很难说。