【问题标题】:MSMQ Messages Are Stuck In The Outgoing QueueMSMQ 消息卡在传出队列中
【发布时间】:2011-05-01 22:57:49
【问题描述】:

虽然我的问题看起来类似于一些已经在 SO 上找到的问题,但这些帖子对我没有帮助,所以这里是:

给定:

  • 同一段的两台机器(自然在同一个域中,实际上在同一张桌子上)
  • 两台机器都是 Windows 7 工作站
  • 两台机器都禁用了防火墙
  • 两台机器互相看到(ping 正常)
  • 其中一个上有一个私有的非事务性消息队列test
  • 发件人机器有HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ\SimpleClient\@BinaryEnabled = 'Yes'
  • 队列所有者从另一台机器发送消息
  • 消息停留在传出队列中,永远无法到达目标。
  • 当从同一台机器(即本地)发送时,消息可以正常到达。

使用以下代码发送消息:

var q = new MessageQueue(@"FormatName:Direct=OS:il-mark-lap\private$\test");
q.Send(string.Format("Test message sent at {0} from {1}", DateTime.Now, Environment.MachineName));

其中 il-mark-lap 是队列中机器的地址。

我到底要做什么才能让这件事发挥作用?

非常感谢。

【问题讨论】:

  • 我也面临同样的问题。马克,你有没有弄明白这件事的真相?
  • 我现在不记得了。无论如何,msmq 有无数问题,所以我们刚刚放弃了它。我的建议 - 远离它。
  • 我添加了赏金,因为我们有同样的问题。即使使用 DIRECT=TCP,消息也只是位于传出队列中。
  • 我们早就放弃了 MSMQ,因为它有很多相关的问题。我的建议 - 效仿。
  • 感谢您的建议。由于即使有赏金也没有人可以提供帮助,我们最终也放弃了 MSMQ,转而支持 RabbitMQ。

标签: .net msmq


【解决方案1】:

我想我找到了这个问题的答案,我遇到了同样的问题,但我只是在没有向客户端发送消息 10 分钟后卡住了。看看这篇知识库文章,它可能会对你有所帮助。此外,在我的情况下,它与重新启动无关,所以不要让你失望,我确实在 netstat 中表现出症状,并且消息最初会在客户端首次启动时通过。

http://support.microsoft.com/kb/2554746

【讨论】:

    【解决方案2】:

    我刚刚处理了这个问题,以下是我为解决它而采取的步骤:

    从 Microsoft 获取 DTCPing 实用程序,在使用 MSMQ 的机器上运行它,DTC 必须能够相互通信才能使 MSMQ 工作。

    Troubleshooting MSDTC issues with the DTCPing tool

    这反过来让我意识到 MSMQ 高度依赖于 NetBIOS 名称 - 机器必须能够单独使用 NetBIOS 名称相互 ping。

    完成此操作后,请确保重新启动所有消息队列服务(在发送计算机和目标计算机上,因为它需要能够执行反向 NetBIOS 操作)。

    就我而言,一旦我使用 NetBIOS 名称解析获得 DTC - 重新启动服务 - 一切都开始神奇地工作。

    我强烈建议您访问 this page 以获取更多资源。

    【讨论】:

    • 我们早就放弃了 MSMQ(好)、.NET(马马虎虎)和 C#(叹气!),转而支持 Java(:-()。但无论如何,谢谢。
    • 对我来说,这是为了确保两台​​机器可以使用 NetBIOS 名称相互 ping 通。 THX
    【解决方案3】:

    我今天遇到了这个问题。为了解决这个问题,我们必须打开接收服务器的消息队列属性对话框,并在服务器安全选项卡上取消选中“禁用未经身份验证的 RPC 调用”框。此外,在私有队列属性 |安全选项卡我们更改了安全性以授予每个人完全控制权。在我的情况下,机器在同一个段上,但不在同一个域上。队列是非事务性的。我们正在为端点绑定 (WCF) 使用 IP 地址,NetBIOS/DNS 不起作用。

    【讨论】:

    • 谢谢。在花了几个小时试图解决一个类似的问题(我的 MSMQ 是公开的和事务性的)之后,没有其他帮助。 “禁用未经身份验证的 RPC 调用”是解决方法。
    • 我们看到了同样的问题。 “禁用未经身份验证的 RPC 调用”已选中。取消选中此选项绕过了该问题。我们怀疑根本原因是某种网络级别的变化,但这种变化让我们立即开始工作。所有传出队列都会立即将它们的消息发送到它们的目标队列。
    【解决方案4】:

    我遇到了一个问题,我们有 2 台服务器向第三台服务器发送消息。只接收到一台服务器的消息。来自另一个的消息被卡在传出队列中,因为“未确认”。

    问题是因为所有计算机都是克隆的 VM,并且在注册表项中具有相同的 QMId:HKLM\Software\Microsoft\MSMQ\Parameters\Machine Cache。我们在解决问题的服务器上重新安装了 MSMQ。

    参考资料:

    http://baleinoid.com/whaly/2012/08/random-bug-msmq-unacknowledged-messages/ http://blogs.msdn.com/b/johnbreakwell/archive/2007/02/06/msmq-prefers-to-be-unique.aspx

    【讨论】:

    • 这对我有帮助,谢谢!
    【解决方案5】:

    答案很简单。确保您可以从源计算机远程登录端口 1801,135,2103 和 2105 到目标计算机,反之亦然。还要确保 MSMQ 在两台机器上都运行。

    【讨论】:

      【解决方案6】:

      局域网中的私有队列通常可以相互发送消息。但有时私有队列可能无法访问并导致其他人创建传出队列......不知道为什么。

      【讨论】:

      • 总是创建传出队列。
      【解决方案7】:

      如果一个服务器突然拒绝接收消息(导致另一个服务器在 Outgoing queue 中有消息队列),这可能是因为 Journal 消息大小限制。

      如果服务器的日志队列积压超过 1GB,MSMQ 将静默拒绝消息。这可以通过查看 C:\Windows\System32\MSMQ\ 及其子目录来验证。

      当日志队列消息被删除并且大小不再超过 1GB 时,它应该立即开始再次接受消息(无需重新启动消息队列服务)。

      【讨论】:

        猜你喜欢
        • 2011-04-21
        • 2012-01-19
        • 2011-06-02
        • 2016-04-17
        • 2018-02-20
        • 2012-03-27
        • 1970-01-01
        • 2017-11-11
        • 1970-01-01
        相关资源
        最近更新 更多