如何清除MSMQ传出队列

时间:2011-01-26 17:27:32

标签: msmq

有没有办法清除传出队列。我似乎无法使用MMC管理单元执行此操作,当我尝试在代码中清除它时,我收到错误Format name is invalid它发送消息的计算机不存在,因此它们永远不会存在发送,但队列填满了MSMQ的最大存储空间,所以每当我的应用程序尝试发送另一条消息时,我得到insufficient resources异常。

我已经尝试了以下格式,但它们都失败了format name is invalid

例外 DIRECT = OS:电脑\私人$ \ QUEUENAME
OS:电脑\私人$ \ QUEUENAME
电脑\私人$ \ QUEUENAME

3 个答案:

答案 0 :(得分:6)

您应该能够从MMC管理单元中手动清除它。当MSMQ达到其存储限制时会变得非常吝啬,因此很多操作都会因“权限被拒绝”等原因而失败。

长期解决方案显然是修改配置,以便为您的特定使用模式提供足够的存储空间。

编辑:您可能遇到与管理功能和远程队列相关的托管API中的限制。看看Ingo Rammer的this文章。它甚至包括一个p调用示例。

答案 1 :(得分:3)

可以使用托管代码清除传出队列:

using (var msgQueue = new MessageQueue(GetPrivateMqPath(queueName, remoteIP), QueueAccessMode.ReceiveAndAdmin))
{
    msgQueue.Purge();
}

其中GetPrivateMqPath为:

if (!string.IsNullOrEmpty(remoteIP))
    return String.Format("FORMATNAME:DIRECT=TCP:{0}\\private$\\{1}", remoteIP, queueName);
else
    return @".\private$\" + queueName;

QueueAccessMode.ReceiveAndAdmin指向传出队列。

答案 2 :(得分:1)

您可以尝试FORMATNAME:DIRECT=OS:computer\PRIVATE$\queuename