2008-11-24 134 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,允许您将文件缓存到磁盘,而不是在内存不足时阻止生产者

相关问题