【问题标题】:Can't receive msmq messages无法接收 msmq 消息
【发布时间】:2012-02-03 14:33:33
【问题描述】:

我有一个使用 msmq 的应用程序的问题:在特定机器上,此应用程序可以发送 msmq 消息,但似乎没有收到任何消息。

这只发生在特定机器上(使用 XP)。

如何调试问题?我在哪里可以找到关于问题发生在哪里以及为什么发生的线索?

在远程机器上,消息卡在传出队列中。

这台机器曾经能够接收消息,但有一天它停止了工作。机器上发生的可能与失去接收消息的能力相关的情况并不明显。

我已经检查了 1801 端口是开放的。

(我在事件查看器中没有找到任何东西)

【问题讨论】:

  • “坏接收器”机器是否已重新启动(整机或消息服务)? 它曾经成功接收过消息吗? 有多少其他机器正在连接到这台机器的队列?这台机器上有多少队列?您应该编辑您的问题以包含您已经尝试过的补救措施的项目符号列表。对队列应用什么安全方案?私人的还是公共的?

标签: windows-xp msmq


【解决方案1】:

当您说“接收”消息时,您的意思是您无法从队列中删除消息,或者无法将消息传递到机器上?

最常见的原因是权限 - 最简单的测试是为所有人和匿名登录设置完全控制。

=== 2 月 4 日 ====

如果消息卡在传出队列中,则队列状态很重要。
如果它是“connected”,那么问题在于让目标队列管理器接受消息。
如果它改为“等待连接”或类似的,则存在网络连接级别的问题。

由于消息正在等待传递,因此没有错误状态,因此这里没有日志记录会有所帮助。 MSMQ 预计消息会被延迟,因此这里没有任何问题,因为假设阻塞将在未来的某个时候清除。最终消息将超时并被丢弃,除非您使用负源日志。

=== 2 月 8 日 ====

好的,如果“DIRECT=TCP:1.2.3.4\Private$\MyQueue”有效,但“DIRECT=OS:servername\Private$\MyQueue”无效,那么它看起来像是名称解析问题。
检查发送机器的 DNS 服务器 IP 地址用于名称解析;检查此服务器以获取目标计算机名称的条目。在发送机器上检查 HOSTS 和 LMHOSTS 文件以获取目标机器名称的任何条目。您甚至可以尝试向 HOSTS 添加一个条目,将目标机器名称映射到 IP 地址。

干杯
约翰·布雷克韦尔

【讨论】:

  • 正如我所说的消息被卡在远程机器上的传出队列中(因此消息不会传递到有问题的机器)
  • 我假设您的意思是传出队列的状态。如何找出该队列的状态(如果可能,不是以编程方式)?谢谢。按照您的建议更改权限并没有解决问题(所以我猜这指向网络问题)。
  • 在计算机管理中,状态是查看传出队列时的第 5 列。下一跳对于检查您是否使用了正确的 IP 地址也很有用。
  • 所以状态是“等待连接”,“next hop(s)”中没有任何内容
  • 您可能会看到一段“等待连接”(持续 HKLM\SOFTWARE\Microsoft\MSMQ\Parameters\WaitTime 设置),然后是尝试连接,然后是一段时间在循环中再次“等待连接”。不过,您应该会在 Next Hop 列中看到目标的 IP 地址。名称解析问题的一项测试是使用 IP 地址来处理消息。
【解决方案2】:

接收方正在监听 1801,但发送方可以连接到该端口吗?在发送方上,转到命令行并执行:telnet receiverHostName 1801
这将检查是否可以打开到该端口的连接。也许是防火墙或其他软件阻止了流量?

【讨论】:

  • +1。这最终对我来说是个问题。这是一个非常基本的事情,我猜很多人在他们的文章/教程中忽略了它。我在我的服务主机上打开了端口 1801(端口 MSMQ 监听传入流量)并且它正在工作。
【解决方案3】:

调试消息队列问题:

  • 使用应用程序检查机器和队列。建议自己编写,或类似QueueExplorer demo。这是确定问题性质的最快方法:端点权限/安全、网络、格式错误的消息等。

  • 在发送者端实现日志记录。可能是错误的接收者返回了错误消息,或者发送者无法建立连接,或者消息太大。

【讨论】:

    【解决方案4】:

    我通常在 Network-Service 下运行该应用程序,并为此用户授予队列的完整权限集。如果我有桌面端点尝试连接到网络服务用户的消息传递。

    试试吧。

    【讨论】:

    • 等等,您授予整个服务帐户,不仅由您的应用程序使用,而且许多对事物的完全权限?
    • Msmq 首先是一个传输协议。如果您希望 n 台计算机使用它来交换消息,您可以在所有计算机上使用来自您的 AD 的相同用户或默认情况下作为网络服务启动 msmq。说明这一点可确保如果消息排队,它将到达目标主机。第二部分,您授予应用程序用户从队列发送/接收消息的适当权限。另一种选择是连接到具有发送/接收权限的用户下的队列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2010-11-14
    • 2011-08-13
    • 2011-07-08
    • 2010-10-30
    • 2010-12-04
    • 2017-03-19
    相关资源
    最近更新 更多