1

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

我正在使用此链接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 的问题?

4

1 回答 1

2

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

maxBrowsePageSize - 400 - 浏览器一次从存储中翻页的最大消息数。

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

于 2019-07-15T22:38:46.267 回答