MSMQ 消息卡在传出队列中
Posted
技术标签:
【中文标题】MSMQ 消息卡在传出队列中【英文标题】:MSMQ Messages Are Stuck In The Outgoing Queue 【发布时间】: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。 【参考方案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 时,它应该立即开始再次接受消息(无需重新启动消息队列服务)。
【讨论】:
以上是关于MSMQ 消息卡在传出队列中的主要内容,如果未能解决你的问题,请参考以下文章