如何检查公共MSMQ是否为空

时间:2010-09-10 16:14:13

标签: 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;
        }

我如何对公共MSMQ进行同样的检查?如果我尝试使用上面的代码检查公共MSMQ,它会在峰值上给我一个错误:

System.ArgumentOutOfRangeException:长度不能小于零。

4 个答案:

答案 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)

狮子座,你确定吗?你不能使用远程Peek的路径名?返回的错误并未说明格式名称无效,如果是这种情况,则会出现这种情况。 事实上,错误似乎出现在“isQueueEmpty = false”行上 - try / catch没有区分peek和isQueueEmpty行。 我打赌isQueueEmpty调用正在接收一个转换为负数的异常。 现在你的解决方案可能是正确的 - MSMQ中的许多远程调用都需要格式名而不是路径名。因此,如果您使用格式名称来创建myQueue,则isQueueEmpty应该可以工作。

干杯

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
 }