Java ActiveMQ客户端无法接收消息

时间:2008-11-24 16:54:17

标签: java jms activemq

我正在尝试在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上运行。

2 个答案:

答案 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)允许您在内存不足时使用假脱机而不是阻塞生产者