2014-01-13 44 views
0

我有一個客戶是拋出一個異常,並用以下訂閱總線:MassTransit故障信息發佈兩次

ServiceBusFactory.New(sbc=>{ 
    ... removed for brevity... 
    sbc.Subscribe(s=>{ 
     ... removed for brevity... 
     var logger = LogManager.GetLogger("Faults"); 
     s.Handler<IFault>(fault => logger.Error(JsonConvert.SerializeObject(fault))); 
    } 
} 

當一個異常被拋出5次,則前進到故障,我可以看到我的處理程序在兩個不同的線程中調用兩次。

我不知道爲什麼,我希望它只發生一次。

也許我正在以這種錯誤的方式去做。我希望能夠記錄發生的故障並能夠重新處理它們。 MassTransit或RabbitMQ是否有內置的功能來處理這個問題?最初我使用MSMQ,並自動拋出錯誤消息到一個相關的_error隊列,但我沒有看到與RabbitMQ隊列。

+0

這是2.9.5還是之前的版本? –

+0

Gist:https://gist.github.com/phatboyg/8428147 –

+0

Chris:2.9.0,幾周前我從代碼中構建它。 –

回答

0

我相信我發現了這個問題...以前嘗試記錄錯誤意味着爲每個特定的錯誤類型而不是IFault對象註冊處理程序。其中一些交易所仍在RabbitMQ中註冊。刪除那些解決了問題。

2

我已確認,如在位於要點:

https://gist.github.com/phatboyg/8428147 

,故障事件在消費者中連續五次失敗後只公佈一次。這與來自NuGet的MT 2.9.5使用RabbitMQ或MSMQ。

+0

我把你的要點轉化爲單元測試,謝謝你!它傳遞得很好,所以我知道這是配置的東西,但對於我的生活,我似乎無法找到問題。我會繼續挖掘,一旦我似乎找到答案,我會發布一些東西,以便其他人可以從我的錯誤中學習。 –

+0

所以,我發現有趣的事情,看上下文有兩個不同的消息ID。上下文之間的其他所有內容似乎都是一樣的。任何想法可能意味着什麼? –

+0

Id或MessageId? Id僅用於內部跟蹤隊列中的每次讀取,MessageId是傳輸中的序列化ID。 –