NES(.NET事件采购)交易失败了吗?

时间:2011-08-24 09:49:22

标签: cqrs

我正在尝试使用NES 0.3(https://github.com/elliotritchie/NES),但在理解发生的情况时遇到了一些麻烦。我正在运行示例应用程序,我已将EventStore配置更改为SQL服务器,并在执行之前插入异常,而SendMessageCommandHandler.Handle()。

然后我启动处理程序和网站。我创建了一个顺利的新用户。在EventStore表中注册了一个事件。然后我尝试发送消息。由于我的例外,这失败了。因此,由于总线的事务性质,没有调度NServiceBus事件。但是在EventStore中,事件已注册并标有 dispatched = 1

我错过了什么?当它没有被NServiceBus发送时,它本不应该被注册为已发送?错误队列中唯一的消息是“SendMessageCommand”。可能我的理解是错的,所以我想在向作者报告这个问题之前我会问这里。

2 个答案:

答案 0 :(得分:1)

在幕后,NES使用EventStore项目。按照设计,在调用MarkAsDispatched()之前,不会考虑调度每个提交。因此,我推测有些东西在意外的位置调用该方法。

首先,您是否有一个EventStore实例正在运行。确保您没有运行两个实例。除此之外,我建议单步执行处理程序以找出提交被标记为已分派的位置。

答案 1 :(得分:1)

NES http://nuget.org/List/Packages/NES的0.3.0.1版本现在只会在所有处理程序成功运行后提交任何更改。

您仍然应该考虑自己管理信息幂等性。您可以通过以下几种方式执行此操作:

默认情况下,EventStore在提交对数据库的更改时会抑制任何环境事务。但是,如果您使用的是SQL Server或Raven,则可以将EventStore的TransactionScopeOption更改为Required,这样可以确保使用MSDTC分发事务,并且将为您处理所有事务。

使用2PC的另一种方法是保留所有收到的消息的日志,并使用它来接受/拒绝特定消息的处理。可以在此处找到此方法的示例:http://blog.jonathanoliver.com/2010/04/extending-nservicebus-avoiding-two-phase-commits/