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#)也有帮助。
我正在创建一个应用程序来连接到多个 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#)也有帮助。