【发布时间】: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