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 消息卡在传出队列中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PowerShell 从 MSMQ 消息队列中删除特定消息

MSMQ 控制台显示消息计数,但没有私有队列的消息

C# 消息队列之MSMQ

转MSMQ 微软消息队列 简单 示例

消息队列MSMQ的使用

使用 Powershell 将 MSMQ 消息从一个队列移动到另一个队列