我正在使用AcitveMQ 5.3。我不知道为什么我的客户端挂在send(of MessageProducer)方法中。
这是我的情况, 我有一台服务器(带有MQ代理),我将服务器从1.0升级到2.0(MQ代理也从5.3升级到5.6)。 同时,由于MQ代理重新启动,客户端收到“Interupted”通知和“Resume”通知。在“恢复”中,我将我的客户端状态发送到服务器并将其挂起。
我有10个客户,其中两个有上述情况。当我向代理发送消息时,我尝试重新启动MQ代理。(与上面类似的情况。)但是,它很难重现。
有没有人有这种经历?挂在MessageProducer方法的发送?
感谢。
更新: 以下是步骤
经纪人和客户版本为5.3
卸载代理并安装5.6代理。
==>如你所说,经纪人和客户之间的版本不匹配。版本不匹配会导致问题吗?但它应具有向后兼容性,对吧?
我将获得TransportListener的中断和恢复方法
我做了一些连接恢复任务,并在Resume call
中向代理发送消息==>正如您所提到的,在Resume调用中发送消息是危险的。但是,我们一直这样做,从来没有遇到过这种问题。
我的程序将在MessageProducer发送中挂起。
那更清楚吗?代码在任何地方都是分开的,发布它并不容易。
感谢。
更新第2部分,
我将MessageProducer发送到另一个线程,但我在Resume回调TransportListener中等待发送完成。在这种情况下,它始终挂起发送消息。但是,“直接在Resume回调中发送消息”偶尔会挂起。这两种情况非常相似。他们为什么如此不同?我挖了源代码(ActiveMQ-Cpp 3.4.5),但我没有找到任何特殊的东西。或者我挖错了文件?我真的想知道它的机制。
顺便说一下,在“更新part2”之前,我使用的是java版MQ。但结果似乎没有java和cpp之间的区别。因此,在“更新第2部分”,我使用ActiveMQ-CPP 3.4.5作为我的库。感谢。
答案 0 :(得分:0)
有点不清楚您的设置是什么,客户端和代理版本是否匹配?如果没有,则问题很可能与此有关。
有些代码在这里会有所帮助。但我认为你所说的是在TransportListener方法resumed()调用期间向代理发送消息。这可能很危险,因为您从同一个线程循环回传输层,这通常会导致问题,因为这些事件实际上不是您发送消息等的地方,而是更多的更新点,可以让您踢关闭新线程或活动来处理连接恢复。
挂起MessageProducer发送可以在生产者流控制开始的情况下触发,但我不相信这种情况发生在您的情况下但没有进一步澄清您的问题很难说肯定。