题
有什么方法可以检查公共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:长度不能小于零。
解决方案
这 Peek
当您使用直接格式名称访问队列时,方法仅在远程计算机上可用。您应该能够使用相同的代码,只要您不依赖目录服务来使您排队。
直接队列名称通常看起来像: DIRECT=URLAddressSpecification/QueueName
其他提示
我刚刚开始使用消息队列,但是我的同事有这种不错的方法来检查队列是否为空:
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
}
}
}
使用这种方法的好处是,它不会引发异常,我认为它不需要您等待超时。
狮子座,你确定吗?您不能使用远程窥视的路径名?返回的错误并未说出无效格式名称,如果是这种情况,这是可以预期的。实际上,该错误似乎在“ Isqueueement = false”行上 - 尝试/捕获没有区分PEEK和ISQUEUEEMPTY线路。我敢打赌,IsqueueEmpty呼叫正在收到一个例外,该异常转化为负数。现在,您的解决方案可能是正确的 - MSMQ中的许多远程调用都需要格式名称而不是路径名。因此,如果您使用格式名称来创建Myqueue,则IsqueueEmpty应该起作用。
干杯
约翰·布鲁韦尔
不隶属于 StackOverflow