MSMQ有WCF问题

时间:2009-02-18 07:04:25

标签: .net wcf msmq

这是一个解释,我在这里。

我们正在创建一个程序,其中msmq的发送方和接收方正在使用WCF。我们实现了一个非常类似的故障句柄: http://msdn.microsoft.com/en-us/library/ms751472.aspxhttp://msdn.microsoft.com/en-us/library/ms789028.aspx

结合使用

一切都很好。我们甚至制作了通过队列运行100条消息的测试用例,所有内容都得到了处理。当我们将其设为10000时,我们会得到一些超时,但是错误处理工作正常,因此消息会重试几次,然后最终会进入毒性队列。

我检查了我的代码并将其发布给其他开发人员。使用队列时出现以下问题多次:

最终未正确读取消息作为故障消息(在PoisonErrorHandler类中)。它总是有这个Exception消息(类型为FaultException): 由于EndpointDispatcher上的AddressFilter不匹配,因此无法在接收方处理带有'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中)时,您可以看到该消息。如果删除此文件,一切都会再次运行。 我无法通过使用应用程序重新创建问题(我可以重新创建te问题,因为我保存了一个损坏的.mq文件),它有时会发生。

这不是一个可行的情况。 - 任何人都知道如何通过代码解决这个问题或如何防止它发生? - 为什么wcf服务可以看到消息,但带有LookupId的MessageQueue什么都看不到? - 是否有另一种方法可以使用LookupId查询队列? - 这种情况怎么会发生?我可以看到所有其他消息。

1 个答案:

答案 0 :(得分:2)

我终于找到了我的问题。

在队列的接收端,我使用的是嵌套的事务范围。发生这种情况时: - 收到无效消息 - 例外 - 抓住例外 - 处理嵌套事务

但是异常提前了一点,嵌套事务还没有开始。

我认为这感染了事务性msmq的事务,并且消息被毒性句柄锁定并且不可读。当服务重新启动时,它可以再次被读取,但由于处理了嵌套事务而再次无法读取。

( 要在接收操作中重播此行为,只需键入以下内容: new TransactionScope(TransactionScopeOption.Required).Dispose(); )