ActiveMQ 队列计数停止在 400

ActiveMQ Queue Count Stops at 400

我正在创建一个应用程序来连接到多个 ActiveMQ 服务器并获取它们不同队列中的消息总数。

我使用的是在此 link ActiveMQ with C# and Apache NMS - Count messages in queue 中找到的代码的略微修改版本 计算队列中的消息数。

我遇到的问题是,如果队列包含超过 400 条消息,此代码将在 400 处停止计数。

public static int GetMessageCount(string server, string user, string pw) {

        int messageCount = 0;
        var _server = $"activemq:ssl://{server}:61616?transport.acceptInvalidBrokerCert=true";

        IConnectionFactory factory = new NMSConnectionFactory(_server);

        using (IConnection connection = factory.CreateConnection(user, pw)) {
            connection.Start();
            using (ISession session = connection.CreateSession(AcknowledgementMode.AutoAcknowledge)) {
                IDestination requestDestination = session.GetQueue(QueueRequestUri);

                IQueueBrowser queueBrowser = session.CreateBrowser((IQueue)requestDestination);
                IEnumerator messages = queueBrowser.GetEnumerator();

                while (messages.MoveNext()) {
                    IMessage message = (IMessage)messages.Current;
                    messageCount++;
                }

                connection.Close();
                session.Close();
                connection.Close();
            }
        }

        return messageCount;
    }

如何获取队列中消息的实际数量?

为什么会出现这种行为? 这是 IEnumerator 接口的问题还是 Apache.NMS.ActiveMQ API?

的问题

通常不能保证浏览器 return 队列中的所有消息。它提供消息的快照,但可能不会 return 所有消息。 ActiveMQ 有减少开销的限制。您可以增加限制,请参阅 maxBrowsePageSize,但仍然无法保证。

maxBrowsePageSize - 400 - 浏览器一次从商店分页的最大消息数。

这些 API 不是为计算消息而设计的,您不应该这样做。只处理消息而不计算它们。如果您想获取指标,请使用某种管理库。 JMX(是的,我知道您使用 C#)也有帮助。