我正在尝试在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),但随后只是锁定。有人告诉我,消息中的一些字符可能是一个转义字符(我使用的是一个长度不一的随机字符串,因为这只是一个性能测试,而不是实际发送任何内容)所以我更改了所有消息到同一个字符串,这是char'2'的重复,但仍然没有运气。 我使用Spring配置加载访问ActiveMQ队列所需的所有组件,并且队列在我的localhost上运行。
答案 0 :(得分: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>
我完全删除了这个配置,现在它实现了梦想。我正在进行性能测试,所以你可能想把自己的约束放进去,但这肯定是我遇到问题的原因!
答案 1 :(得分:0)
它是消息传递的经典问题;如何处理缓慢的消费者。 FWIW最新的ActiveMQ版本(如5.2)允许您在内存不足时使用假脱机而不是阻塞生产者