2013-04-08 77 views
0

我使用AcitveMQ 5.3。我不知道为什么我的客户端在发送(MessageProducer的)方法中被挂起。ActiveMQ - 挂在发送方法

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

我有10个客户,其中两个有以上情况。我尝试重新启动MQ代理,同时向代理发送消息(类似上面的情况)。但是,很难重现。

有没有人有过这样的经历?挂在MessageProducer方法的发送?

谢谢。


更新: 下面是步骤,

  1. 经纪人和客户端版本为5.3

  2. 卸载代理和安装5.6经纪人。

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

  3. 我会中断,并恢复TransportListener的方法

  4. 我做一些连接恢复任务,并在恢复通话将消息发送到代理

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

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

这样更清楚吗?代码无处不在,发布它并不容易。

谢谢。


更新第2部分,

我移动的MessageProducer发送到另一个线程,但我在TransportListener简历回调等到发送完成。在这种情况下,它总是挂在发送消息。但是,“直接在Resume回调中发送消息”偶尔挂起。这两种情况非常相似。他们为什么如此不同?我挖掘了源代码(ActiveMQ-Cpp 3.4.5),但我没有找到任何特殊的东西。或者我挖错了文件?我真的想知道它的机制。

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

谢谢。

回答

0

它有点不清楚你的设置是什么,客户和经纪人版本是否匹配?如果不是,那么问题很可能与此有关。

一些代码在这里会有所帮助。但我认为你所说的是你在TransportListener方法恢复()调用期间向代理发送消息。这可能是危险的,因为你从同一个线程循环回到传输层,这通常会导致问题,因为这些事件并不是真正意义上的发送消息等的地方,而是更多的可以让你踢更新点关闭一个新线程或活动来处理连接恢复。

挂在MessageProducer发送可以触发在生产者流量控制踢的情况下,但我不相信这是发生在你的情况,但没有进一步澄清你的问题很难说肯定。

+0

我更新了我的帖子中的步骤。谢谢。 – 2013-04-09 06:26:55

+0

在你的情况下,我的答案是,在生产中不要错过客户和经纪人的版本,除非你想有一个糟糕的时间。不要发送交通事件回调,除非你想要有一段糟糕的时间。 – 2013-04-09 13:50:25

+0

感谢您的回复。我还有一个问题,发送MessageListener事件回调(例如,onMessage)是否也很危险? – 2013-04-11 09:20:25