【问题标题】:Getting the Id property of an MSMQ mesage with NServiceBus使用 NServiceBus 获取 MSMQ 消息的 Id 属性
【发布时间】:2013-10-10 11:04:48
【问题描述】:

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

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

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

我错过了什么?

【问题讨论】:

    标签: msmq nservicebus


    【解决方案1】:

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

    public IBus Bus { get; set; }
    

    然后用它来获取消息ID:

    this.Bus.CurrentMessageContext.Id
    

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

    编辑

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

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

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

    【讨论】:

    • 我认为您可能已经过早地回答了...请参阅问题的最后一段。
    • 我认为,在 NSB 4.0 中,标签不再包含相关 ID。它是空白的。反正我能找到本地消息就好了。这个想法是有一个 id 来连接消息(因为它是在管理管理单元中查看的)与日志。
    • 我正在使用 3.3,其中仍然使用标签。恐怕帮不了你 - 你试过在雅虎群里问吗?
    【解决方案2】:

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

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

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

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

    最后,让我说,我们正在将这种通知功能构建到 NServiceBus 周围的Particular Service Platform 中。 13 年 11 月的测试版中,我们有一个显示错误并允许重新处理消息的 UI,通知功能可能会在年底前准备就绪。

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

    【讨论】:

    • 感谢 Udi 的回复。但是,即使消息没有被移到错误队列中——如果我在处理队列中删除 Id,当我在事件处理程序中暂停并查看 bus.currentmessagecontext.Id 时,它们也不相同.此外,当 NSB 记录时,是否会为处理的每条消息创建不同的日志?
    • 我正在更新一些较旧的守护程序以与 NServiceBus 一起使用,因此有相当多的现有日志记录已完成到平面文件(我希望保持这一完整,只需将消息 Id 之类的内容添加到那个日志。我们不太担心垃圾邮件,因为如果数据库关闭,将无法发送消息。我宁愿等待而不是自己构建它,但我们必须比那更早投入生产:(
    • 我们未来使用 NServiceBus 的方向要求我们越来越远离 MSMQ 消息 ID,因此我会避免编写与此挂钩的代码。我们现在拥有的 ServiceInsight 工具显示的是 NServiceBus 消息 ID,而不是传输级别 ID - 也许您应该从那里开始。
    • udi,好像bus.currentMessageContext.Id上的Id和correlationId是等价的。我在 MSMQ 管理管理单元和 Id 中添加了相关 Id 列。管理单元中出现的 id 与 NSB Id 完全相同,但“\0”除外。如果我在使用“ReturnToSourceQueue”工具时尝试使用日志中的 NSB Id - 它不起作用。但是,当我将“\0”添加到该消息的末尾时 - 它可以工作。您能否就“\0”是什么以及为什么它不属于 NSB Id 提供一些见解?
    • MSMQ 需要一个斜线和一个数字。你是说 ReturnToSourceQueue 工具不像我描述的那样工作吗?如果是这样,请在 GitHub 上提出问题,指定您使用的版本。
    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 2012-01-19
    • 2016-09-09
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    相关资源
    最近更新 更多