4

我花了几天时间阅读 MSDN、论坛和文章,但找不到解决问题的方法。

作为 PoC,我需要从多台机器上消费一个队列,因为我需要在消费者端进行容错。性能不是问题,因为每天应该交换少于 100 条消息。

我编写了两个简单的控制台应用程序,一个作为客户端,另一个作为服务器。使用 Framework 4.0(也在 3.5 上测试过)。消息正在使用事务。

一切都在单台机器(Windows 7)上运行良好,即使在运行多个消费者应用程序实例时也是如此。

现在我有一个 2012 和一个 2008 R2 虚拟测试服务器在同一个域中运行(但无论如何都不想使用 AD 集成)。我正在使用 IP 地址或“。” 在端点地址属性中防止 DNS/AD 解析副作用。

如果队列由消费者托管并且生产者在远程私有队列上提交消息,则一切正常。如果我交换 2012 和 2008 服务器的消费者/生产者角色,这也是如此。

但是当消费者从远程队列读取并且生产者在本地提交消息时,我永远无法使用 WCF 运行此操作。提交永远不会失败,我的问题是在消费者方面。

我希望使用 netMsmqBinding 来运行它,但我也尝试使用 msmqIntegrationBinding。对于每个测试,我调整了代码和配置,然后确认当消费者从本地队列消费时它运行正常。

我所做的最后一个测试是仅在生产者(本地队列)上使用 WCF(msmqIntegrationBinding),在消费者(远程队列)上使用 System.Messaging.MessageQueue:它工作正常!=> 我的目标是在两边都使用 WCF 和 netMsmqBinding。

在我看来,我已经证明这个问题是 WCF 问题,而不是 MSMQ 问题。这与安全、身份验证、防火墙、传输、协议、MSMQ 版本等无关。

使用 MS Service Trace Viewer 的错误信息:

接收消息时使用 msmqIntegrationBinding(打开队列正常):从队列接收消息时出错:无法导入指定的事务。(-1072824242, 0xc00e004e)。确保 MSMQ 已安装并正在运行。确保队列可用于接收。

使用 netMsmqBinding,在打开队列时:将“172.22.1.9\private$\Test”队列路径名转换为格式名时出错:指定的队列路径名无效。(-1072824300, 0xc00e0014)。排队通道上的所有操作均失败。确保队列地址有效。MSMQ 必须在启用 Active Directory 集成的情况下安装并且可以访问它。

如果有人可以帮助找出为什么我的配置无法由 WCF 处理,这是一种比 Messaging 更优雅且可配置的方式,我将不胜感激!

 Thank you.
4

1 回答 1

0

您可能需要发布您的消费者代码和配置以提供更多想法,但它可能是队列名称的构造 - 例如

格式名称:DIRECT=TCP:192.168.0.2\SomeQueue

有几种不同的方法可以连接到队列,并且当您在远程或本地时它也会发生变化。

我过去发现这篇文章可以提供帮助:

http://blogs.msdn.com/b/johnbreakwell/archive/2009/02/26/difference-between-path-name-and-format-name-when-accessing-msmq-queues.aspx

此外,MSDN 上的 MessageQueue 构造函数... http://msdn.microsoft.com/en-us/library/ch1d814t.aspx

于 2014-05-19T03:21:12.953 回答