Jus*_*tin 4 c# msmq netmsmqbinding
有没有办法检查公共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;
}
Run Code Online (Sandbox Code Playgroud)
我如何对公共MSMQ进行同样的检查?如果我尝试使用上面的代码检查一个公共MSMQ,它会在峰值上给我一个错误:
System.ArgumentOutOfRangeException:Length不能小于零.
我刚刚开始使用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
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用此方法的好处是它不会抛出异常,我认为它不要求您等待超时发生.
Peek只有在使用直接格式名称访问队列时,该方法才可用于远程计算机.您应该能够使用相同的代码,只要您不依赖目录服务就可以进入队列.
直接队列名称通常类似于: DIRECT=URLAddressSpecification/QueueName