2008-11-24 66 views
3

我試圖在ActiveMQ上實現性能測試,因此設置了基本的生產者和使用者來通過隊列發送和接收消息。我創建了一個製片人,沒有任何問題,得到它寫的消息隊列特定號碼:Java ActiveMQ客戶端無法接收消息

for(int i = 0; i < numberOfMessages; i++){ 
       try{ 
        String message = generateText(sizeOfMessage); 
        produceMessage(message); 
       } 
       catch (Exception e) { 
        logger.error("Caught exception while sending message", e); 
       } 
      } 

這仍然沒有問題完成,我已經與管理網站上的檢查,這證實了這一點正在等待的消息數量。

當我嘗試從隊列中接收消息時,會發生此問題。使用簡單的使用者從隊列中讀取數據,它將從隊列中讀取各種數量的消息,但在嘗試接收其中一條消息時會停止。我可以看到隊列中還有消息要讀取,但客戶端不會傳遞其中一條消息。 我用一個簡單的方法來接收消息:

Message message = jmsTemplate.receive(); 

,它適用於一些消息(約20-30),但是隻是鎖定。有人向我建議,消息中的一些字符可能是一個轉義字符(我使用的是隨機字符串,因爲這只是一個性能測試,而不是實際發送任何內容),所以我更改了所有消息到相同的字符串,這是字符'2'的重複,仍然沒有運氣。 我使用Spring配置來加載訪問ActiveMQ隊列所需的所有組件,並且隊列在本地主機上運行。

回答

4

沒有太多的意見,但爲了將來的參考,如果任何人有同樣的問題,我找到了解決方案。爲ActiveMQ的配置限制的內存減緩下來之前使用的發送者和接收者的數量,給我的默認值分別爲:

<systemUsage> 
      <systemUsage> 
       <memoryUsage> 
        <memoryUsage limit="20 mb"/> 
       </memoryUsage> 
       <storeUsage> 
        <storeUsage limit="1 gb" name="foo"/> 
       </storeUsage> 
       <tempUsage> 
        <tempUsage limit="100 mb"/> 
       </tempUsage> 
      </systemUsage> 
     </systemUsage> 

我完全刪除此配置,現在它工作一個夢。我正在進行性能測試,所以你可能想要放入自己的限制,但這絕對是我的問題的原因!

0

它是消息傳遞的經典問題;如何處理緩慢的消費者。 FWIW更新的ActiveMQ版本,例如5.2,允許您將文件緩存到磁盤,而不是在內存不足時阻止生產者

相關問題