2013-04-08 78 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