这是一个虽然解释,但我走了。
我们正在创建一个程序,其中 msmq 的发送方和接收方使用 WCF。我们实现了一个与此非常相似的故障处理:http: //msdn.microsoft.com/en-us/library/ms751472.aspx结合http://msdn.microsoft.com/en-us/library/ms789028。 aspx
一切都很好。我们甚至制作了通过队列运行 100 条消息的测试用例,一切都得到处理。当我们将其设置为 10000 时,我们会遇到一些超时,但 de 错误处理工作正常,因此消息被重试几次,然后它最终进入毒队列。
我签入了我的代码并将其发布给其他开发人员。使用队列时出现以下问题不止一次:
未正确读取的消息最终会作为错误消息(在 PoisonErrorHandler 类中)。它总是有这个异常消息(FaultException 类型):由于 EndpointDispatcher 的 AddressFilter 不匹配,接收方无法处理带有 To 'net.msmq://localhost/private/adpqueue' 的消息。检查发送方和接收方的 EndpointAddresses 是否一致。在此错误中 Code.Name = Sender 和 Code.SubCode.Name = DestinationUnreachable
在重试次数之后,它会变成 MsmqPoisonMessageException,它会得到一个 LookupId。有了这个lookupid,我执行了ReceiveByLookupId(lookupId)(使用标准的System.Messaging.MessageQueue 类)。这会导致 InvalidOperationException。
在此之后,服务将自行重新启动并且循环将重新启动,这永远不会结束。(重新启动后,清除队列永远不会停止)。
如果您打开计算机管理并查看队列中是否有消息,则它是空的。但是当我使用文本编辑器打开 p0000001.mq 文件(在 C:\WINDOWS\system32\msmq\storage 中)时,您可以看到该消息。如果你删除这个文件,一切都会重新开始。我无法使用应用程序重新创建问题(我可以重新创建问题,因为我保存了损坏的 .mq 文件),它只是有时会发生。
这不是一个可行的情况。- 任何人都知道我如何通过代码解决这个问题或如何防止它发生?- 为什么 wcf 服务可以看到消息,而带有 LookupId 的 MessageQueue 什么也看不到?- 是否有另一种方法可以使用 LookupId 查询队列?- 这种情况怎么会发生?我可以看到所有其他消息。