为啥将消息放入死信队列 (MSMQ)?

Posted

技术标签:

【中文标题】为啥将消息放入死信队列 (MSMQ)?【英文标题】:Why is message put into a dead-letter queue (MSMQ)?为什么将消息放入死信队列 (MSMQ)? 【发布时间】:2016-01-12 08:31:40 【问题描述】:

序言: 我有一个 Web 应用程序,它不时发送 MSMQ 消息(UseDeadLetterQueue = true)。我还可以看到其中一些消息被放入系​​统死信队列。但是,我无法直接从“计算机管理”控制台看到失败原因。 我找到了以下资源:https://msdn.microsoft.com/en-us/library/ms789035(v=vs.110).aspx, 它允许检查消息状态和失败。但它只能在 WCF 范围内使用(因为它使用 OperationContext)。


基本上检查消息状态和失败原因是我需要的,但是如何配置 WCF 服务来侦听死信队列并跟踪放入其中的所有消息,而不管发件人是谁? 或者是否有任何其他(非 WCF)方法来了解为什么将特定消息放入死信队列的原因?

【问题讨论】:

【参考方案1】:

您找到的链接文章告诉您如何创建一个从 DLQ 中取出消息的 WCF 服务。请注意,它告诉您必须使用 AddressFilterMode = AddressFilterMode.Any 来拉出所有消息,而不管发件人是谁。

注意:当消息在 DLQ 上结束时,您将无法获得有关此事件发生原因的信息。无论您是否使用 WCF,该信息都不会存储在队列中。

例如,如果您的收件人是使用 MSMQ 绑定的 WCF 侦听器,则抛出的任何异常都将导致消息无法传递。 MSMQ 会重试一段时间,然后最终放弃并将消息放入 DLQ。因此,如果您想知道您需要在 WCF 服务中添加一些跟踪以捕获和跟踪抛出的异常的原始原因。

【讨论】:

以上是关于为啥将消息放入死信队列 (MSMQ)?的主要内容,如果未能解决你的问题,请参考以下文章

消息队列 - 死信、延迟、重试队列

如何清空Windows消息队列

转MSMQ 微软消息队列 简单 示例

消息队列概念

使用 Powershell 将 MSMQ 消息从一个队列移动到另一个队列

Azure SB 队列将消息发送到禁用的死信队列