我使用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