3

我正在尝试在 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 队列所需的所有组件,并且该队列在我的本地主机上运行。

4

2 回答 2

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>

我完全删除了这个配置,现在它是一个梦想。我正在进行性能测试,所以你可能想设置自己的约束,但这绝对是我的问题的原因!

于 2008-11-24T17:33:19.210 回答
0

这是消息传递的经典问题;如何处理缓慢的消费者。FWIW 更新的 ActiveMQ 版本(例如 5.2)允许您在内存不足时假脱机到磁盘而不是阻塞生产者

于 2008-11-26T09:47:12.223 回答