ActiveMQ Artemis QueueBrowser 始终为 Enumeration.hasMoreElements() 返回 false

问题描述 投票:0回答:1

我有一个 JMS 客户端,它可以在队列中查找消息,但也有一个拒绝。拒绝的人总是返回

false
以获得
enum.hasMoreElements()
。我只能得出结论,在消费者不活跃的情况下,在
if
/
else
块中尝试此操作是错误的。如果我编写一个仅使用
QueueBrowser
(即没有
MessageConsumer
)的客户端,那么它会像广告中那样工作。我希望经验丰富的兽医能够帮助我理解。

// Consumer/Browser
TextMessage msgIn = session.createTextMessage();
boolean consumerBool = false;
if (consumerBool == true) {
   System.out.println("Consumer ready to consume ...");
   msgIn = (TextMessage)consumer.receive();
   System.out.println("Consumer received " + msgIn.getText());
} else {
   System.out.println("Starting QueueBrowser ... ");
   cn.start();
   QueueBrowser browser = session.createBrowser(queue);
   Enumeration enumm = browser.getEnumeration();
   boolean elementsBool = enumm.hasMoreElements();
   Queue temp = browser.getQueue();
   System.out.println("Browser using queue = " + temp);
   System.out.println("enumm.hasMoreElements() return = " + elementsBool);

   while(enumm.hasMoreElements()) {
       msgIn = (TextMessage)enumm.nextElement();
       System.out.println("Browsed msg [" + msgIn.getText() + "]");
   }
   browser.close();
}

cn.close();
session.close();

下面的队列是正确的,里面有消息,但是

hasMoreElements()
false
。你可以看到我做了强制性的
cn.start()
。我在创建
enum
browser
之前就开始了它。

jms activemq-artemis
1个回答
0
投票

这几乎肯定是由消费者从代理预取消息引起的,这意味着这些消息无法浏览。

已发送给消费者但尚未被确认的消息被称为“正在传递”,您可以通过检查队列上的“DeliveringCount”指标来查看有多少消息处于此状态(例如通过网络管理员)安慰)。此类消息无法提供给其他消费者,因为它们已被认领。

将消息组分发给消费者是一种性能优化,这样消费者就不必为“每条”消息在网络上进行往返。如果您使用的是核心 JMS 客户端,那么您可以通过连接 URL 上的 consumerWindowSize 参数来控制此行为。您可以在

文档
中阅读更多相关信息。

© www.soinside.com 2019 - 2024. All rights reserved.