JmsTemplate 的 browseSelected 未检索所有消息
JmsTemplate's browseSelected not retrieving all messages
我有一些 Java 代码可以从 ActiveMQ queue 读取消息。该代码使用来自 Spring 的 JmsTemplate,我使用 "browseSelected" 方法从 queue 检索任何消息,这些消息在 header 中的时间戳超过 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 条消息,即使有几千条消息符合指定的条件。
当我之前使用另一种 queueing 技术与此代码 (IBM MQ) 时,它会处理所有符合条件的记录。
我想知道我是否遇到了 ActiveMQ 的预取限制问题:http://activemq.apache.org/what-is-the-prefetch-limit-for.html
版本:ActiveMQ 5.10.1 和 Spring3.2.2.
在此先感谢您的帮助。
根据目标策略中 maxBrowsePageSize 选项的配置,代理默认只会 return 最多 400 条消息。您可以增加该值,但必须小心,因为消息被分页到内存中,因此可能导致您陷入 OOM 情况。
你必须永远记住,消息代理不是数据库,使用它通常会以泪流满面。
我有一些 Java 代码可以从 ActiveMQ queue 读取消息。该代码使用来自 Spring 的 JmsTemplate,我使用 "browseSelected" 方法从 queue 检索任何消息,这些消息在 header 中的时间戳超过 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 条消息,即使有几千条消息符合指定的条件。
当我之前使用另一种 queueing 技术与此代码 (IBM MQ) 时,它会处理所有符合条件的记录。
我想知道我是否遇到了 ActiveMQ 的预取限制问题:http://activemq.apache.org/what-is-the-prefetch-limit-for.html
版本:ActiveMQ 5.10.1 和 Spring3.2.2.
在此先感谢您的帮助。
根据目标策略中 maxBrowsePageSize 选项的配置,代理默认只会 return 最多 400 条消息。您可以增加该值,但必须小心,因为消息被分页到内存中,因此可能导致您陷入 OOM 情况。
你必须永远记住,消息代理不是数据库,使用它通常会以泪流满面。