【问题标题】:JmsTemplate's browseSelected not retrieving all messagesJmsTemplate 的 browseSelected 未检索所有消息
【发布时间】:2015-06-30 21:45:15
【问题描述】:

我有一些从 ActiveMQ 队列中读取消息的 Java 代码。该代码使用 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 的“doInJms”方法将符合条件的消息添加到列表(“myMessages”)中,该列表随后会得到进一步处理。

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

当我之前在此代码中使用另一种排队技术 (IBM MQ) 时,它会处理所有符合条件的记录。

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

版本:ActiveMQ 5.10.1 和 Spring 3.2.2。

提前感谢您的帮助。

【问题讨论】:

  • 请记住,每个 JMS 队列实现都是不同的。例如,当使用 OAQ 时,就不可能使用自定义标准...

标签: spring activemq


【解决方案1】:

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

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

【讨论】:

  • 感谢您提供此信息。看来我得重新考虑我处理这段代码的方法了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 2013-07-30
  • 2013-02-27
  • 1970-01-01
  • 2014-01-29
  • 2017-09-12
  • 2014-07-23
相关资源
最近更新 更多