2013-08-12 163 views
7

我們正面臨着ActiveMQ及其消費者的隨機問題。我們觀察到,即使連接到ActiveMQ隊列,很少消費者也沒有收到消息。但消費者重新啓動後,它工作正常。消費者未收到來自ActiveMQ的消息

我們有一個在側面的ActiveMQ名爲testQueue隊列。消費者試圖從這個隊列中排列消息。我們正在使用Spring的DefaultMessageListenerContainer來達到這個目的。消息正從ActiveMQ Broker傳送到消費者節點。從tcpdump也很明顯,消息正在到達消費者節點,但實際的消費者代碼無法看到消息。換句話說,消息似乎停留在ActiveMQ使用者代碼或Spring的DefaultMessageListenerContainer中。

請參閱下圖。以更清楚地解決這個問題。消息正在到達Consumer節點,但未達到「實際消費者類別」,這意味着該消息陷入AMQ消費者代碼或Spring DMLC中。

enter image description here

以下是ActiveMQ的管理拍攝的所有細節。

隊列名稱/待-消息計數/消費者計數/信息-入隊/消息 - 已出列 testQueue/9/1/9/0

以下是在更多的細節。

連接ID/SessionID的/選擇/排入/隊列中取出/調度/調度-隊列/預取 ID:bearsvir52-45176-1375519181268-3:5/1// 9/0/9 /二百五十○分之九

從第二張表中可以明顯看出,消息正在傳遞給消費者,但消費者沒有確認消息。因此,這些消息被卡在代理端的Dispatched-Queue中。

爲你們注意幾點:

1)沒有時間差的B/W代理節點和消費者節點。

2)觀察到消費者側tcpdump的。我們可以看到MessageDispatch(Openwire)數據包被傳輸到消費者節點,但是找不到MessageAck(Openwire)。

3)有時它是工作在一個節點上,有時它是在相同的節點上創建的問題。的這個

+0

你能張貼在Spring配置,顯示ConectionFactory,葉準直器和監聽器類? –

+0

我面對完全相同的問題。你有沒有得到解決方案? –

+0

有沒有更新?我有一個類似的問題 – Nereis

回答

2

花了很多時間來找出解決方案。在AMQ故障轉移的情況下,似乎有一些問題與org.apache.activemq.ActiveMQConnection.java類有關。在這種情況下,連接對象不在消費者一方開始。

以下是我在ActiveMQConnection.java文件中添加的修復程序,並編譯了源以創建activemq-core-x.x.x。罐子

private final Object startMutex = new Object(); 

加入了createSession方法檢查

public Session createSession(boolean transacted, int acknowledgeMode) throws JMSException { 
    synchronized (startMutex) { 
     if(!isStarted()) { 
      start(); 
     } 
    } 
1

一個原因可以是不正確地使用CachingConnectionFactory(帶有緩存消費者)與聽者容器動態調整消費者(最大消費者>消費者)。您最終可能只是坐在游泳池中而不被積極使用的緩存消費者。您永遠不需要使用偵聽器容器來緩存消費者。

對於這樣的問題,我一般建議用跟蹤記錄運行,你可以看到所有的消費活動。

相關問題