2011-06-08 51 views
1

這是我的理解,當使用NServiceBus時,我們基本上有2種異常。如何在NServiceBus中回滾NHibernate事務

環境:意味着任何必需的組件當前不可用。通常會導致事務的完整回滾。這是我在NServiceBus文檔回滾背後看到的描述(包括將消息放回到總線上 - 這聽起來很棒)。我該怎麼做呢?

驗證:由於業務邏輯,規則等原因,正在處理的消息無法成功。在我希望回滾所有數據庫交互的位置,但將命令保留在隊列中沒有任何價值。在這種情況下,我只想回滾事務的NHibernate部分 - 而不是MSMQ部分。我該怎麼做呢?通常,我會在處理任何單個消息之前執行驗證,但是如果您將多個消息綁定到一個事務中,並且想要將它們全部回滾,則無法通過預驗證。

我的假設是要麼是瘋狂明顯的答案,我已經忽略了它,或者我想要做的事情是不可能的(關於驗證例外)。

回答

1

謝謝你的回答。我相信答案在兩者之間。

我們很遺憾不能實現驗證服務,但我們只是爲消息處理邏輯添加了更好的前期驗證。

不幸的是,在我們到達v3之前,我們目前無法使用錯誤隊列,因爲我們正在利用消息響應功能來提醒集成商解決其消息問題。拋出未處理的錯誤可防止生成任何響應。

1

NSB負責通過將消息移動到錯誤隊列(v2.5)來獲取消息。在v3中,此功能得到增強,並將爲您提供更多選項來處理故障(數據庫,自定義等)。錯誤隊列在app.config中配置。

1

根據我的經驗,確保消息在參與分佈式事務時可能成功的可能性非常高(可能也更合適)。

因此,當您調度命令消息時,大多數驗證邏輯應該已經執行,並且回滾保留用於真正的例外情況。

如果您的客戶端無法執行驗證,也許您應該在當前服務前插入驗證服務。此驗證服務可以在他們到達真實服務之前將其他地方的無效命令消息路由到別處。