繁体   English   中英

MSMQ WCF 在开发人员代码中未发生错误时处理后进入毒物队列的事务队列消息

[英]MSMQ WCF Transactional Queue Message going to Poison Queue after proccessing when no error is occurring in developer code

这实际上不是一个问题。 而是为任何遇到相同问题的人提供的答案,因为我花了 2 天时间才弄清楚出了什么问题。

场景:我们有一个事务性 MSMQ 队列,我们通过 WCF 接收消息,其中TransactionScopeRequired = true, TransactionAutoComplete = true

当收到一条消息时,它在我们的代码中正常处理而没有错误,但随后消息的“AbortCount”会增加,并根据您的 MSMQ 绑定配置将其发送到重试队列或中毒队列。 我们的代码中没有抛出任何错误,应该已经成功处理。

以下异常发生在任何开发人员代码之外,并且仅在禁用“仅我的代码”时显示。

传输通道检测到有害消息。 发生这种情况是因为邮件超过了最大传递尝试次数,或者是因为通道检测到邮件存在根本问题。 内部异常可能包含附加信息。

原来发生的事情是在我的消息处理代码中,我正在启动一个数据库事务,然后既没有提交它(由于没有更改)也没有回滚它(错误地)。 这导致环境 WCF 事务检测到中止事务并回滚。

解决方案:如果您没有提交事务,请不要只处理它。 所有事务都必须提交或回滚,这对某些人来说可能很明显,但你不知道你不知道什么。

调用Transaction.Comit( ) 来提交事务,而不是让它不完整地处理掉。 我还注意到,如果您在内部事务中调用.Rollback,MSMQ 环境事务不喜欢它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM