微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当开发人员代码中没有发生错误时,MSMQ WCF 事务队列消息在处理后进入毒害队列

如何解决当开发人员代码中没有发生错误时,MSMQ WCF 事务队列消息在处理后进入毒害队列

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

场景:我们有一个事务性 MSMQ 队列,我们​​通过 WCF 使用 TransactionScoperequired = true,TransactionAutoComplete = true

接收消息

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

以下异常发生在任何开发者代码之外,并且仅在“仅我的代码”被禁用时才会出现。

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

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

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

解决方法

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。