我正在创建一个应用程序以连接到多个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的问题?
答案 0 :(得分:1)
通常,不能保证浏览器会返回队列中的所有消息。它提供了消息的快照,但可能不会全部返回。 ActiveMQ有减少开销的限制。您可以增加限制,请参见maxBrowsePageSize,但是仍然不能保证。
maxBrowsePageSize-400-浏览器一次可以从商店中调出的最大消息数。
那些API并非用于计数消息,因此您不应该这样做。只需处理消息而不计算它们。如果要获取指标,请使用某种管理库。 JMX(是的,我知道您使用C#)也可能会有所帮助。