我有一个端点,它接收消息并创建一个传奇,以便能够在以后的某个时间响应相应的消息。该消息包含一些xml文档,此xml文档将在此消息处理程序中进行验证。如果我们发现一些验证错误,我们会创建一个消息响应(不涉及传奇),以通知源端点,xml doc的内容是错误的。在验证错误的情况下,saga不会按预期存储并按需要存储。但我仍然想回复原始端点。问题是,nservicebus还对回复进行了回滚。
有办法吗?我试图将回复包装到新的事务范围中,但这不起作用:
using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
this.bus.Reply(message);
scope.Complete();
}
有什么建议吗?提前致谢
其他信息: 原始问题是我没有抛出(或重新抛出)任何异常而是回复 捕获部分的发起者(我知道它的设计不好)。
Saga存储有一个应用于id的唯一属性,该id来自始发端点。由于我没有在回复情况下抛出或传递任何异常(发生验证错误),nservicebus总是存储saga。如果原始端点更正了xml以使其有效并重新发送消息(具有相同的id),则nservicebus尝试存储具有相同id的新saga(在ravenDB上导致并发异常,因为具有该唯一属性的saga已经存在)。作为一个快速修复,我想改变唯一属性,而使用消息id作为唯一的prop。在这种情况下,我确信消息id始终是唯一的,并且saga并发异常不会再发生。你知道这是否会导致任何副作用吗?
答案 0 :(得分:1)
您可以利用消息处理程序管道。管道中的第一个处理程序可以进行验证,并在必要时进行任何响应。在验证期间,不要抛出异常,只需回复即可。第二个处理程序可以启动Saga并将状态设置为“无效”或类似的东西。我的假设是你将获得另一个有效数据的请求,然后你将遵循“正常”过程并将状态设置为“有效”并继续。