2017-02-16 151 views
0

不確定我的Service Bus 1.1的重試策略邏輯有什麼問題。我們無法使用Azure服務總線。我嘗試了幾種不同的配置,但仍然沒有運氣讓它着火。它只會移動到例外。Service Bus 1.1(On Prem)消息發件人重試策略不起作用

TokenProvider provider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", "<key goes here>"); 
var retryPolicy = new RetryExponential(TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(3), 
       TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(5), 1000); 
var _factory = MessagingFactory.Create("<Namespace Address>", provider); 
var _sender = _factory.CreateMessageSender("Analytics"); 
_sender.RetryPolicy = retryPolicy; 
var message = new BrokeredMessage("message"); 
try 
{ 
    _sender.Send(message); 
} 
catch(Exception e) 
{ 
    Console.WriteLine(e); 
} 

爲了測試目的,我制定了異常大的重試策略。據我所知,它從不重試信息。我已經測試了各種例外情況,包括那些瞬息萬色的情況。

我已經經歷了這些帖子和文章已經閱讀:

有沒有人跑進這之前?我希望我只是想念一些簡單的事情。

+0

報告的錯誤消息是什麼? – Raj

+0

重試策略應該嘗試在拋出異常之前重新發送消息。這就是我要問的,爲什麼不這樣做?沒有錯誤消息,它只是不重試。我們正在模擬服務總線故障。例外情況按要求工作,重試從未發生。它立即引發異常。 –

+0

@ J-Mac - 請您詳細說明您是如何模擬服務總線故障的。我目前面臨同樣的問題,你已經提到你的問題,我想看看我的重試邏輯是否工作或不... – gkb

回答

0

重試機制的工作原理是這樣

從服務總線返回暴露IsTransient屬性,指示如果客戶端應該重試運行的異常。內置的RetryExponential策略依賴於MessagingException類中的IsTransient屬性,該類是所有Service Bus異常的基類。

檢查OperationTimeout

console.WriteLine(_factory.GetSettings().OperationTimeout); 

如果該值小於maxBackoff然後設置OperationTimeout高於maxBackoff

_factory.GetSettings().OperationTimeout = TimeSpan.FromMinutes(6); 

創建的MessageFactory

+0

是的,我已經閱讀,並在問題中說明我已經驗證IsTransient是真實的。我們正在測試的異常是MessagingExceptions(儘管在代碼示例中我使用了一個通用的示例)。 –

+0

maxBackoff大於OperationTimeout(默認爲一分鐘),在MessagingFactorySettings中設置OperationTimeout大於maxBackoff – Raj

+0

我按照建議對OperationTimeout進行了更新,但行爲相同。重試從未發生。 –

0

之後,我發現這個博客帖子:

右鍵單擊在Solution Explorer中的項目,然後選擇管理的NuGet包。在搜索框中鍵入瞬態故障處理,然後單擊搜索。選擇Enterprise Library - 瞬態故障處理應用程序塊程序包。單擊「安裝」後,會將一組必要的支持瞬態故障處理應用程序塊的程序集和引用添加到項目中。

實現接口後,我能夠成功執行重試策略。

我仍然不確定爲什麼默認的不會工作。