如何检查公共MSMQ是否为空

有没有办法检查公共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:Length不能小于零。

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

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

我刚刚开始使用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 } } } 

使用此方法的好处是它不会抛出exception,我认为它不要求您等待超时发生。

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

干杯

约翰休斯威尔