如何在使用 WCF 的事务性 MSMQ 中将消息显式标记为中毒

Posted

技术标签:

【中文标题】如何在使用 WCF 的事务性 MSMQ 中将消息显式标记为中毒【英文标题】:How can I explicitly mark messages as poisoned in a transactional MSMQ with WCF 【发布时间】:2012-11-23 04:45:24 【问题描述】:

我使用的是 MSMQ 版本 4,并且有一个事务队列。我正在使用 WCF 监听传入消息的队列。

在处理过程中存在对第三方组件的依赖,这些组件可能会出现故障或在较长时间内不可用。为了弥补这一点,我使用 MSMQ 4 (http://msdn.microsoft.com/en-us/library/aa395218.aspx) 中的有害消息处理功能以 y 次等待时间重试消息 x 次。

但是在某些情况下,我知道输入消息无效/中毒。当发生这种情况时,抛出异常会使消息遵循有害消息处理例程,就像所有其他消息一样,具有所有重试和等待时间。但是,当我知道消息已中毒时,我没有理由重试并等待配置的时间让中毒队列处理它。

是否有任何方法可以将邮件显式标记为已中毒,使其不会遵循配置的重试流程并立即移至中毒队列?

【问题讨论】:

我也有同样的问题,我认为你没有找到解决方案? @Leon 确实,还没有找到解决方案。 我是一个 MSMQ 新手,我还没有尝试过这个 - 如果它很傻,对不起。这在您链接到的文章中,“毒物队列是主队列的子队列,名为“毒物”,由 MSMQ 自动生成。要访问它,请提供主队列名称,后跟一个“;”和子队列名称,在本例中为“毒药”。难道您不能检测毒药消息,将它们从主队列中删除并手动将它们发送到内置毒药队列吗? 【参考方案1】:

好吧,我建议在这种情况下将请求数据存储在数据库中,不要抛出任何异常,以便成功处理 WCF 消息并将从队列中删除。

如果需要,我们可以稍后处理这些数据,处理数据库中的数据比监控/管理毒队列更容易。

您可以进行一些配置,基于您可以决定消息的下一个处理时间戳,并且线程可以重新处理来自 DB 的此类消息。

【讨论】:

以上是关于如何在使用 WCF 的事务性 MSMQ 中将消息显式标记为中毒的主要内容,如果未能解决你的问题,请参考以下文章

WCF msmq 事务和工作单元

MSMQ 事务性消息传递如何工作?

如何处理 WCF 的 MSMQ 绑定中的消息失败

消息队列MSMQ的使用

WCF net.msmq 服务自动激活

IIS 中的 WCF,在工作组模式下使用 MSMQ