4

有什么方法可以检查公共 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,则会在 Peak 上出现错误:

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

4

4 回答 4

7

我刚开始使用消息队列,但我的同事有这种检查队列是否为空的好方法:

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
        }
    }
}

使用这种方法的好处是它不会抛出异常,而且我认为它不需要你等待超时发生。

于 2011-12-29T13:58:40.777 回答
5

当您使用直接格式名称访问队列时,该Peek方法仅在远程计算机上可用。您应该能够使用相同的代码,只要您不依赖目录服务让您进入队列。

直接队列名称通常类似于:DIRECT=URLAddressSpecification/QueueName

于 2010-09-10T16:18:41.747 回答
0

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

干杯

约翰·布雷克韦尔

于 2010-09-10T16:52:26.047 回答
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
 }
于 2021-01-17T17:25:34.013 回答