我需要在处理程序中获取msmq消息的Id,以便将该Id写入日志。
当邮件发送到错误队列时,会发送一封电子邮件通知我们邮件失败。一旦导致消息的错误得到解决,我们需要使用'ReturnToSourceQueue'NServiceBus工具再次尝试该消息。如果不记录该Id,则很难在查看消息队列时跟踪哪条消息。
我看过的每个地方都建议Bus.CurrentMessageContext.Id在查看ComputerManagement->服务和应用程序 - >消息队列 - >中的队列时,会给出与消息ID列中相同的ID。一些队列] - >队列消息。但是,这些ID似乎并不相同。
我错过了什么?
答案 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访问此值,但您不需要这样做以查找本地消息。