【问题标题】:Update body of a "FailedMessages"-document in ravendb (servicecontrol instance )更新 ravendb 中“FailedMessages”文档的正文(服务控制实例)
【发布时间】:2016-03-11 14:35:34
【问题描述】:

我希望能够重试失败的 NServicebus 消息但更新正文。

我已成功更新“FailedMessages”文档的 ravendb(服务控制实例)中的正文标记 但是 api 仍然返回旧的主体(来自 bodyUrl)。因此,当我从我们的自定义文档查看器重试消息时,当到达处理程序时,正文仍然是旧的。

是否可以更新正文?

-编辑- 当您使用 Servicecontrol API 进行重试时。是重新发送错误队列中的消息还是从 servicecontrol ravendb 实例收集的数据放在一起发送?

【问题讨论】:

    标签: nservicebus


    【解决方案1】:

    消息体不能更新,这违背了消息不可变的基本原则……

    如果出于业务原因修改数据,则应由您的应用程序逻辑(即协调过程)来完成。 有意义吗?

    编辑:-

    错误消息从错误队列中处理并存储在 RavenDB 文档中,当调用重试或重试批处理时,消息被组合并发送到处理字段消息的原始端点。只是要清楚。

    请注意:ServiceControl 的 API 不是公开且受支持的 API...

    【讨论】:

    • 嗯,是的,您不应该编辑消息是有道理的。但在我们的例子中,我们有自己的定制应用程序,使用服务控制 API 来查看失败的消息并重试它们。在重试之前在那里编辑消息是有意义的。不同项目中的几个端点确实使用了服务控制。如果可以的话,我不想依赖这些项目。而且由于我确实可以访问服务控制存储其数据的 RavenDB 数据库实例,我的想法是我应该能够做到这一点。你说不可能,请解释一下。
    • 编辑了我的答案来回答你的问题,希望这是有道理的,你可以看看代码,因为它是open source here
    • 刚刚发现这是可能的。看我的回答。 +1 链接到源代码
    【解决方案2】:

    我刚刚设法更新了邮件正文。毕竟是可能的。

    这是来自 ServiceControl 的一些源代码:

    DocumentStore.DatabaseCommands.PutAttachment("messagebodies/" + bodyId, null, bodyStream, new RavenJObject
                {
                    {"ContentType", contentType},
                    {"ContentLength", bodySize}
                });
    

    之前我尝试更新具有正文标记的 FailedMessage 文档。但我需要更新附件。上面代码中的bodyId不是UniqueMessageId,而是在ProcessingAttempts -> MessageMetadata -> MessageId中找到的MessageId。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      相关资源
      最近更新 更多