2017-05-03 34 views
3

在Rebus中使用二級重試(https://github.com/rebus-org/Rebus/wiki/Automatic-retries-and-error-handling)我需要在之間重試一個消息到錯誤隊列。如何轉發一個帶有例外情況的消息到Rebus錯誤隊列

這工作:

_bus.Advanced.Routing.Send("my-queue.error",failedMessage.Message, failedMessage.Message); 

但失敗的消息中積累的例外是不是一起帶來的,使得在錯誤隊列中的失敗消息,而沒用。

理想我想勾入ITransport實例,做這樣的事情

await _transport.Send(errorQueueAddress, transportMessage, transactionContext); 

(從PoisonQueueErrorHandlerhttps://github.com/rebus-org/Rebus/blob/333dbedf486acb92bd6c6250755537032c6215fd/Rebus/Retry/PoisonQueues/PoisonQueueErrorHandler.cs

但沒有明顯的方式來獲得該實例。

有關如何實現此目的的任何想法?

回答

0

將消息從第二級處理程序轉發到錯誤隊列的一種方法是簡單地引發異常 - 通常的n重試也適用於第二級重試,所以如果一切都保持失敗,則消息最終會以錯誤隊列。

如果您希望在將消息轉發到錯誤隊列時模擬Rebus的行爲,那麼您可以獲得完整的錯誤詳細信息,因爲它們將通過IFailed<YourMessage>上的ErrorDescription屬性包含在Rebus中。

轉發郵件時,您可以創建這些頭:

var details = failedMessage.ErrorDescription; 

var headers = new Dictionary<string, string> 
{ 
    {Headers.SourceQueue, "your-input-queue"}, 
    {Headers.ErrorDetails, details} 
}; 

,然後你應該轉發傳輸消息到錯誤隊列,從而保護信息的身份和其他所有頭完好無損:

我認爲這將是最現實的Rebus行爲模擬。

相關問題