有什么方法可以检查公共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应该起作用。

干杯

约翰·布鲁韦尔

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top