使用NServiceBus获取MSMQ消息的Id属性

时间:2013-10-03 16:30:49

标签: msmq nservicebus

我需要在处理程序中获取msmq消息的Id,以便将该Id写入日志。

当邮件发送到错误队列时,会发送一封电子邮件通知我们邮件失败。一旦导致消息的错误得到解决,我们需要使用'ReturnToSourceQueue'NServiceBus工具再次尝试该消息。如果不记录该Id,则很难在查看消息队列时跟踪哪条消息。

我看过的每个地方都建议Bus.CurrentMessageContext.Id在查看ComputerManagement->服务和应用程序 - >消息队列 - >中的队列时,会给出与消息ID列中相同的ID。一些队列] - >队列消息。但是,这些ID似乎并不相同。

我错过了什么?

2 个答案:

答案 0 :(得分:3)

您在MMC插件或队列资源管理器中看到的消息ID不同的原因是,当消息“移动”到错误队列时,实际发生的是创建具有相同正文的新MSMQ消息标头和发送到错误队列。

此外,当处理消息失败时,NServiceBus已经为您记录了此消息并包含消息的ID,因此已经为您完成了。

如果您获取已记录的ID并将其传递给ReturnToSourceQueue工具,那么一切都将正常工作。

最后一块拼图是在邮件失败时发送电子邮件。现在,我不确定这是最明智的想法,因为当数据库脱机或第三方Web服务无响应时,您最终可能会向您的运营团队发送垃圾邮件。尽管如此,如果那是你想要做的,那么我建议使用电子邮件附加程序来记录错误。

最后,让我说我们正在围绕NServiceBus在Particular Service Platform中构建这种通知功能。我们有一个用户界面显示错误,并允许在2013年11月作为测试版重新处理消息,通知功能可能会在年底准备好。

这是一个真正的问题,你是想等待还是自己构建它。

答案 1 :(得分:0)

只需在处理程序中创建一个总线实例:

public IBus Bus { get; set; }

然后使用它来获取消息ID:

this.Bus.CurrentMessageContext.Id

调用处理程序时将注入Bus实例。

修改

现在我已经阅读了这个问题......

CurrentMessageContext.Id返回CorrId字段下邮件头中的内容。这可以在Server Management的Label列中看到。

MessagId列中显示的消息ID是发送计算机上存在的消息ID。我不确定如何从CurrentMessageContext访问此值,但您不需要这样做以查找本地消息。