3

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

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

我看过的每个地方都表明 Bus.CurrentMessageContext.Id 在查看 ComputerManagement->Services and Applications->Message Queuing->[Some Queue]->Queue 中的队列时会给我与 Message ID 列中相同的 Id消息。但是,这些 id 似乎并不相同。

我错过了什么?

4

2 回答 2

3

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

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

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

对您来说,最后一个难题是在消息失败时发送电子邮件。现在,我不确定这是否是最明智的想法,因为当数据库脱机或第 3 方 Web 服务变得无响应时,您最终可能会向您的运维团队发送垃圾邮件。不过,如果这是您想要做的,那么我建议在记录错误时使用电子邮件附加程序。

最后,让我说,我们正在围绕 NServiceBus将这种通知功能构建到特定服务平台中。我们有一个显示错误的 UI,并允许重新处理消息,作为 13 年 11 月的测试版,通知功能可能会在年底前准备好。

这真的是一个你是想等待还是自己建立这个的问题。

于 2013-10-05T09:28:06.647 回答
0

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

public IBus Bus { get; set; }

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

this.Bus.CurrentMessageContext.Id

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

编辑

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

CurrentMessageContext.Id 返回 CorrId 字段下的消息头中的内容。这可以在服务器管理的标签列中看到。

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

于 2013-10-04T08:10:02.630 回答