【问题标题】:How to Purge an MSMQ Outgoing Queue如何清除 MSMQ 传出队列
【发布时间】:2011-06-16 00:24:52
【问题描述】:

有没有办法清除传出队列。看来我不能用 MMC 管理单元做到这一点,当我尝试在代码中清除它时,我收到一个错误 Format name is invalid 它发送消息的计算机不存在,所以它们永远不会被发送,但是队列填满了 MSMQ 的最大存储空间,所以每次我的应用程序尝试发送另一条消息时,我都会收到 insufficient resources 异常。

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

DIRECT=OS:COMPUTER\private$\queuename
操作系统:COMPUTER\private$\queuename
COMPUTER\private$\queuename

【问题讨论】:

  • 发送消息在发送到另一台计算机之前保存在队列中。

标签: msmq


【解决方案1】:

您应该能够从 MMC 管理单元中手动清除它。 MSMQ 在达到其存储限制时会变得非常吝啬,因此很多操作都会失败并出现“权限被拒绝”之类的情况。

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

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

【讨论】:

  • 不错的文章,但没能尝试。因为屏幕上的一张图片向我展示了我做错了什么,哈哈。我右键单击队列名称,但清除选项除外以显示在那里。必须更深入并右键单击“队列消息”
【解决方案2】:

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

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 指向传出队列。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 1970-01-01
      • 2016-02-23
      • 1970-01-01
      • 2010-11-06
      • 2011-05-01
      • 1970-01-01
      • 2012-08-01
      • 2016-08-10
      相关资源
      最近更新 更多