JmsTemplate的browseSelected不检索所有邮件

时间:2015-06-30 00:39:34

标签: spring activemq

我有一些Java代码从ActiveMQ队列中读取消息。代码使用Spring的JmsTemplate,我使用" browseSelected"从队列中检索其标头中的时间戳超过7天的任何消息的方法(通过在messageSelector参数中创建适当的条件)。

    myJmsTemplate.browseSelected(myQueue, myCriteria, new BrowserCallback<Integer>() {
        @Override
        public Integer doInJms(Session s, QueueBrowser qb) throws JMSException {
            @SuppressWarnings("unchecked")
            final Enumeration<Message> e = qb.getEnumeration();
            int count = 0;
            while (e.hasMoreElements()) {
                final Message m = e.nextElement();
                final TextMessage tm = (TextMessage) MyClass.this.jmsQueueTemplate.receiveSelected(
                        MyClass.this.myQueue, "JMSMessageID = '" + m.getJMSMessageID() + "'");

                myMessages.add(tm);
                count++;
            }

            return count;
        }
    });

BrowserCallback&#34; doInJms&#34; method将符合条件的消息添加到列表中(&#34; myMessages&#34;),随后进一步处理。

问题在于我发现代码每次运行时只会处理400条消息,即使有数千条消息符合指定条件。

当我以前使用此代码(IBM MQ)的其他排队技术时,它将处理符合条件的所有记录。

我想知道我是否遇到ActiveMQ的预取限制问题:http://activemq.apache.org/what-is-the-prefetch-limit-for.html

版本:ActiveMQ 5.10.1和Spring 3.2.2。

提前感谢您的任何帮助。

1 个答案:

答案 0 :(得分:2)

默认情况下,代理将仅返回目标策略中maxBrowsePageSize选项配置的最多400条消息。您可以增加该值,但必须谨慎,因为消息被分页到内存中,因此会导致您进入OOM情况。

您必须始终记住,消息代理不是数据库,使用它时通常会以泪流满面。