2011-03-04 48 views
1

我有一個服務(service1)從外部數據庫讀取數據。轉換它併發送到隊列。如何在拋出異常時從nservicebus處理程序發送回覆?

第二個服務(service2)處理消息並對其進行處理。當處理失敗的異常被拋出,並且NServiceBus重試5次來處理它(正常行爲),但回覆永遠不會被髮送。 。:(

所有服務工程交易

我的問題是: 如何發送應答(或只是發送不同的消息發回)從處理器到服務1時拋出異常

我想只是通知處理失敗的服務2服務1

編輯1: 對於reeded記錄在外部數據庫更具體的服務1標記它需要菲爾特呃閱讀其他數據。

我想返回從service2到service1的響應,它取消了引發異常的那些記錄的記錄。

從外部數據庫讀取數據的下一次迭代可能會再次記錄此記錄。

回答

5

您可以隨時包裹Bus.Reply,而不是它自己的TransactionScope,e.g:

using (var scope = new TransactionScope(TransactionScopeOptions.RequiresNew)) 
{ 
    Bus.Reply(your message here) 
    scope.Complete(); 
} 

這分開,你正在執行從導致錯誤的交易錯誤而導致的交易。

0

Bus.Reply()永遠不會產生的原因是它是同一事務的一部分。一種選擇是查看錯誤隊列並將消息推回原始發件人。

另一種方法是利用傳輸中的FailedMessageProcessing事件。這樣做的缺點是你不知道什麼是失敗,只是失敗。它也會報告每個可能不合意的重試。

可能出現這種情況,您確實需要同步請求/響應,因此NSB可能不是您所需要的。如果您向我們提供一些有關商業案例的更多細節,我們可能會提供更多建議。

+0

「的原因Bus.Reply()從不是,它的一部分同一筆交易「。 - 那也是我的想法。我不需要同步通信。也許捕捉異常並返回適當的錯誤代碼對我來說已經足夠了。我失去了重試,但我的'重試'將由下一次從外部數據庫讀取數據的迭代來保證。 – dariol

0

就像增強喬納森·奧利弗,環繞using語句具有finally塊的try-catch塊之後要這樣

  finally 
      { 
       using (var scope = new System.Transactions.TransactionScope(TransactionScopeOption.RequiresNew)) 
       { 
        Bus.Reply<MyResponseObject>(reply); 
        scope.Complete(); 
       } 
      } 
相關問題