有没有办法检查公共MSMQ是否为空?对于私人MSMQ来说,这很简单:
private bool IsQueueEmpty(string path)
{
bool isQueueEmpty = false;
var myQueue = new MessageQueue(path);
try
{
myQueue.Peek(new TimeSpan(0));
isQueueEmpty = false;
}
catch (MessageQueueException e)
{
if (e.MessageQueueErrorCode == MessageQueueErrorCode.IOTimeout)
{
isQueueEmpty = true;
}
}
return isQueueEmpty;
}
我如何对公共MSMQ进行同样的检查?如果我尝试使用上面的代码检查公共MSMQ,它会在峰值上给我一个错误:
System.ArgumentOutOfRangeException:长度不能小于零。
答案 0 :(得分:7)
我刚刚开始使用Message Queues,但我的同事有一个很好的方法来检查队列是否为空:
if (MessageQueue.Exists(fullQueuePath))
{
// FYI, GetMessageQueue() is a helper method we use to consolidate the code
using (var messageQueue = GetMessageQueue(fullQueuePath))
{
var queueEnum = messageQueue.GetMessageEnumerator2();
if (queueEnum.MoveNext())
{
// Queue not empty
}
else
{
// Queue empty
}
}
}
使用此方法的好处是它不会抛出异常,我认为它不要求您等待超时发生。
答案 1 :(得分:5)
当您使用直接格式名称访问队列时,Peek
方法仅在远程计算机上可用。您应该能够使用相同的代码,只要您不依赖目录服务就可以进入队列。
直接队列名称通常类似于:DIRECT=URLAddressSpecification/QueueName
答案 2 :(得分:0)
干杯
John Breakwell
答案 3 :(得分:0)
要检查队列是否为空,最简单的方法是使用方法:GetAllMessages()。如果消息为零,则队列为空。
string queueName = ".\private$\testqueue";
if (MessageQueue.Exists(queueName))
{
MessageQueue mq = new MessageQueue(queueName);
var allMessages = mq.GetAllMessages();
if (allMessages.Length > 0)
{
//Queue is not empty
}
else
{
//Queue is empty
}
}
else
{
//Queue does not exist
}