我正在尝试NES 0.3 (https://github.com/elliotritchie/NES),但在理解发生了什么事情时遇到了一些麻烦。我正在运行示例应用程序,其中我已将EventStore配置更改为SQL服务器,并在执行离开SendMessageCommandHandler.Handle()之前插入异常。
然后启动处理程序和网站。我创建了一个运行良好的新用户。在EventStore表中注册了一个事件。然后我试着传达一个信息。由于我的异常,这个失败了。因此,由于总线的事务性质,没有分派NServiceBus事件。但是在EventStore中,事件被注册并标记为分派=1。
我错过了什么?当它没有被NServiceBus调度时,它肯定不应该被注册为已调度?错误队列中唯一的消息是"SendMessageCommand"。这可能是我的理解是错误的,所以我想在向作者报告这个问题之前,我应该在这里问一下。
0.3.0.1版本的NES http://nuget.org/List/Packages/NES现在只会在所有处理程序成功运行后才提交任何更改。
您仍然应该考虑自己管理消息幂等性。您可以通过以下几种方式实现:
EventStore默认情况下在向数据库提交更改时抑制任何环境事务。但是,如果您使用SQL Server或Raven,您可以将EventStore的TransactionScopeOption更改为Required,这应该确保事务将使用MSDTC分发,并且一切都将为您处理。
使用2PC的另一种选择是保留所有接收到的消息的日志,并使用它来接受/拒绝特定消息的处理。此方法的一个示例可以在这里找到:http://blog.jonathanoliver.com/2010/04/extending-nservicebus-avoiding-two-phase-commits/
在幕后,NES使用EventStore项目。按照设计,在调用markas分派()之前,每个提交都不会被视为已分派。因此,我推测有什么东西在一个意想不到的位置调用了该方法。
首先,你是否有一个单独的EventStore实例在运行。确保没有两个实例正在运行。除此之外,我建议逐步遍历处理程序,找出提交在哪个点被标记为已调度。