【问题标题】:NServicebus: reply message in case of exceptionNServicebus:异常情况下回复消息
【发布时间】:2014-08-21 07:37:55
【问题描述】:

我有一个端点,它接收消息并创建一个 saga,以便能够在稍后的时间点响应相应的消息。该消息包含一些 xml 文档,并且此 xml 文档将在此消息处理程序中进行验证。如果我们发现一些验证错误,我们会创建一个消息响应(不涉及 saga)来通知原始端点 xml 文档的某些内容是错误的。在验证错误的情况下,saga 不会按预期和要求存储。但我仍然想回复原始端点。问题是,nservicebus 也会对回复进行回滚。

有办法吗?我试图将回复包装到一个新的事务范围中,但这不起作用:

        using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
        {
            this.bus.Reply(message);

            scope.Complete();
        }

有什么建议吗?提前致谢

附加信息: 最初的问题是我没有抛出(或重新抛出)任何异常,而是回复 发给 catch 部分的发起者(我知道它的糟糕设计)。

Saga 存储有应用于 id 的唯一属性,该属性来自原始端点。而且由于我没有在回复案例中抛出或传递任何异常(发生验证错误),nservicebus 总是存储传奇。如果原始端点更正了 xml 以使其有效并重新发送消息(具有相同的 id)nservicebus 尝试存储具有相同 id 的新 saga(在 ravenDB 上导致并发异常,因为具有该唯一属性的 saga 已经存在)。作为快速修复,我想更改唯一属性并使用消息 ID 作为唯一道具。在这种情况下,我确信消息 id 始终是唯一的,并且不会再次发生 saga 并发异常。不知道会不会有副作用?

【问题讨论】:

  • 为什么需要回滚?在接触任何其他资源之前,您不能预先完成所有验证吗?并且只是MarkAsComplete 传奇,这样它就不会被持久化?
  • 我将 saga 标记为完成,以防出现错误。非常感谢!

标签: nservicebus


【解决方案1】:

您也许可以利用消息处理程序管道。管道中的第一个处理程序可以在必要时进行验证和任何响应。在验证过程中,不要抛出异常,只需回复即可。第二个处理程序可以启动 Saga 并将状态设置为“无效”或类似的东西。我的假设是您将收到另一个包含有效数据的请求,然后您将遵循“正常”流程并将状态设置为“有效”并继续。

【讨论】:

  • 尝试了这个解决方案并为我工作,并将传奇标记为已完成,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-09
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
相关资源
最近更新 更多