2011-08-24 36 views
1

我正在嘗試NES 0.3(https://github.com/elliotritchie/NES),但在理解發生什麼時遇到了一些麻煩。我正在運行示例應用程序,我已將EventStore配置更改爲SQL Server,並在執行離開SendMessageCommandHandler.Handle()之前插入了一個異常。NES(.NET Event Sourcing)事務失敗?

然後我啓動處理程序和網站。我創建了一個很好的新用戶。一個事件在我的EventStore表中註冊。然後我嘗試發送一條消息。由於我的例外,這失敗了。因此,由於總線的事務性質,沒有派發NServiceBus事件。但在EventStore中,事件被註冊並標記爲dispatched = 1

我錯過了什麼?當它沒有被NServiceBus發送時,它當然不應該被註冊爲已分派的?錯誤隊列中唯一的消息是「SendMessageCommand」。這可能是我的理解,那就是錯誤的,所以我想在此之前向這位作者提出這個問題。

回答

1

的0.3.0.1版本NES http://nuget.org/List/Packages/NES後,所有的處理程序已成功運行將現在只能提交任何修改。

您應該仍然認爲,雖然管理信息idempotentcy自己。爲此,您可以通過兩種方式:

的EventStore默認更改提交到數據庫時禁止任何環境事務。但是,如果您使用SQL Server或Raven,則可以將EventStore的TransactionScopeOption更改爲Required,以確保交易將使用MSDTC分發,並且所有內容都將爲您處理。

使用2PC將是保持一個日誌中的所有的接收到的消息,並使用該接受/另一種可選拒絕特定消息的處理。這種方法的一個例子可以在這裏找到:http://blog.jonathanoliver.com/2010/04/extending-nservicebus-avoiding-two-phase-commits/

+0

謝謝艾略特。當我回到辦公室時,我會嘗試一下 - 但是如果我在EventStore中更改事務抑制,我希望它只寫一次(即「派送」位將無用,不需要更新)。你知道這件事嗎? – Werner

+0

我不能編輯評論 - 但只是忘記我的問題。我用你的鏈接完成它。感謝您的迅速反應! – Werner

1

在引擎蓋下,NES使用EventStore項目。按照設計,在調用MarkAsDispatched()之前,每個提交不被視爲分派。因此,我會推測在某個意想不到的位置正在調用該方法。

首先,你有沒有EventStore運行的單個實例。確保您沒有運行兩個實例。除此之外,我建議單步執行處理程序,以確定在哪一點將提交標記爲已分派。

+0

你好喬納森,我使用的NES例子幾乎沒有改變,我無法找到EventStore的雙重實例。你可能會爭辯說,「repository.Add()」必須是我NServiceBus處理程序中的最後一行 - 但不知何故,存儲庫使用的順序決定了我們是否存在不一致。但它確實消除了這個問題。 – Werner