我想知道是否有办法以编程方式检查使用C#在私有或公共MSMQ中有多少消息?我有代码,使用try/catch中包含的peek方法检查队列是否为空,但我从未见过有关显示队列中消息数的任何信息.这对于监视是否正在备份队列非常有用.
Gar*_*ght 34
您可以直接从.NET读取队列的性能计数器值:
using System.Diagnostics;
// ...
var queueCounter = new PerformanceCounter(
"MSMQ Queue",
"Messages in Queue",
@"machinename\private$\testqueue2");
Console.WriteLine( "Queue contains {0} messages",
queueCounter.NextValue().ToString());
Run Code Online (Sandbox Code Playgroud)
ole*_*sii 23
没有可用的API,但您可以使用GetMessageEnumerator2哪个足够快.样品:
MessageQueue q = new MessageQueue(...);
int count = q.Count();
Run Code Online (Sandbox Code Playgroud)
履行
public static class MsmqEx
{
public static int Count(this MessageQueue queue)
{
int count = 0;
var enumerator = queue.GetMessageEnumerator2();
while (enumerator.MoveNext())
count++;
return count;
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试了其他选择,但每个选项都有一些缺点
Peek抛出异常的方法似乎存在问题如果你需要一个快速的方法(在我的盒子上25k次/秒),我推荐基于MQMgmtGetInfo()和PROPID_MGMT_QUEUE_MESSAGE_COUNT的Ayende版本:
for C# https://github.com/hibernating-rhinos/rhino-esb/blob/master/Rhino.ServiceBus/Msmq/MsmqExtensions.cs
对于VB https://gist.github.com/Lercher/5e1af6a2ba193b38be29
起源可能是http://functionalflow.co.uk/blog/2008/08/27/counting-the-number-of-messages-in-a-message-queue-in/但我不相信这个从2008年开始实施工作.