2016-08-23 84 views
0

我在TomEE容器內的Web應用程序中使用Spring JMS,並且想使用JMSXGroupIDs將我的消息分組在一起。我使用以下Spring JMS Listener容器配置。Spring JMS併發性和JMSXGroupID

<jms:listener-container container-type="default" connection-factory="jmsFactory" cache="none" acknowledge="auto" transaction-manager="transactionManager" concurrency="1-5" > 
    <jms:listener id="files-queue-listener" selector="mimetype ='application/xml'" destination="filesQueue" ref="filesQueueListener"/> 
</jms:listener-container> 

爲了進行快速測試,我發送了1000封由同一個JMSXGroupID組合在一起的消息。我使用VisualVM查看了線程,我期望在整個測試過程中只能看到一個偵聽器容器處於活動狀態。發生的事情是,這個工作是在5個消息監聽器容器之間分配的。我檢查了ActiveMQ Web控制檯,就代理而言,這些消息都發送給同一個用戶。爲什麼消息將在不同的消息監聽器容器線程上處理?是否有任何理由?

回答

1

首先,一些術語 - 有一個容器包含5個消費者線程(來自ActiveMQ角度的5位消費者)。

我剛剛對5位固定用戶進行了測試,它按預期工作。

當我使用變量消費者運行時,當容器增加了消費者數量時,我確實看到具有相同組ID的消息傳遞給「新」消費者;它隨着消息傳遞給同一個(新)消費者而穩定下來。

由於ActiveMQ負責分發,因此創建新消費者時,它必須是其算法中的某些內容;我認爲這與Spring沒有任何關係。

更改爲固定數量的消費者可能是一種可行的解決方法。

編輯

使用變量這裏的消費者可能不是一個好主意,反正因爲當容器檢測慢下來,它將會終止消費者 - 這將迫使ActiveMQ的開始使用一個不同的消費者對任何關聯的羣組。

+0

另請參閱我的編輯。 –

+0

我試圖將它改爲5,問題仍然是一樣的。 – Animal2

+0

你確定你正確設置標題嗎?它每次都適合我。查看調試器中的入站消息以確保頭文件已設置。 'ActiveMQTextMessage {commandId = 15,... groupID = foo,... text = foo}' –

0

一些更多的輸入(從tomee郵件列表複製,因爲它不會被自動鏈接):

1 1個JMS會話= 1個線程,所以如果你不使用其他執行人您要處理的消息單線程 2-彈簧使用偵聽器容器的執行器,這是一個配置來調整線程模型