我使用AcitveMQ 5.3。我不知道为什么我的客户端在发送(MessageProducer的)方法中被挂起。ActiveMQ - 挂在发送方法
这是我的情况, 我有一台服务器(带有一个MQ代理),并且我将服务器从1.0升级到2.0(MQ代理也从5.3升级到5.6)。 与此同时,由于MQ代理重新启动,客户端收到“Interupted”通知和“Resume”通知。在“简历”中,我将我的客户端状态发送到服务器,并将其挂起。
我有10个客户,其中两个有以上情况。我尝试重新启动MQ代理,同时向代理发送消息(类似上面的情况)。但是,很难重现。
有没有人有过这样的经历?挂在MessageProducer方法的发送?
谢谢。
更新: 下面是步骤,
经纪人和客户端版本为5.3
卸载代理和安装5.6经纪人。
==>正如您所说的,代理和客户端之间的版本不匹配。版本不匹配会导致问题?但它应该具有向后兼容性,对吧?
我会中断,并恢复TransportListener的方法
我做一些连接恢复任务,并在恢复通话将消息发送到代理
==正如你所说,它>在Resume呼叫中发送消息是危险的。但是,我们一直这样做,以前从未遇到过这种问题。
我的程序会挂在MessageProducer发送。
这样更清楚吗?代码无处不在,发布它并不容易。
谢谢。
更新第2部分,
我移动的MessageProducer发送到另一个线程,但我在TransportListener简历回调等到发送完成。在这种情况下,它总是挂在发送消息。但是,“直接在Resume回调中发送消息”偶尔挂起。这两种情况非常相似。他们为什么如此不同?我挖掘了源代码(ActiveMQ-Cpp 3.4.5),但我没有找到任何特殊的东西。或者我挖错了文件?我真的想知道它的机制。
顺便说一句,在“更新part2”之前,我正在使用java版本MQ。但结果似乎java和cpp之间没有区别。因此,在“更新part2”中,我使用ActiveMQ-CPP 3.4.5作为我的库。
谢谢。
我更新了我的帖子中的步骤。谢谢。 – 2013-04-09 06:26:55
在你的情况下,我的答案是,在生产中不要错过客户和经纪人的版本,除非你想有一个糟糕的时间。不要发送交通事件回调,除非你想要有一段糟糕的时间。 – 2013-04-09 13:50:25
感谢您的回复。我还有一个问题,发送MessageListener事件回调(例如,onMessage)是否也很危险? – 2013-04-11 09:20:25