ActiveMQ队列计数停止在400

时间:2019-07-15 21:38:18

标签: c# activemq nms

我正在创建一个应用程序以连接到多个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的问题?

1 个答案:

答案 0 :(得分:1)

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

maxBrowsePageSize-400-浏览器一次可以从商店中调出的最大消息数。

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