2017-02-16 4 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); 
} 

Я сделал повторную политику аномально большой для целей тестирования. Насколько я могу судить, он никогда не повторяет сообщение. Я тестировал различные исключения, включая те, где istransient истинно.

Я прочитал эти посты и статьи уже:

Кто-нибудь столкнулся с этим раньше? Надеюсь, я просто пропустил что-то простое.

+0

Какое сообщение об ошибке сообщается? – Raj

+0

Предполагается, что политика повтора должна повторить отправку сообщения до того, как будет выбрано исключение. Вот что я спрашиваю, почему это не так? Нет сообщения об ошибке, он просто не повторяет. Мы имитируем сбои служебной шины. Исключения работают по желанию, повторение никогда не происходит. Он немедленно выдает исключение. –

+0

@ J-Mac - не могли бы вы подробнее рассказать о том, как вы имитировали сбои служебной шины.В настоящее время я сталкиваюсь с той же проблемой, о которой вы говорили в своем вопросе, и я хочу проверить, работает ли моя логика повтора или нет ... – gkb

ответ

0

механизм Retry работает как это

Исключения вернулись из Service Bus выставить свойство IsTransient, указывающее, если клиент должен повторить операцию. Встроенная политика RetryExponential основана на свойстве IsTransient в классе MessagingException, который является базовым классом для всех исключений Service Bus.

Проверьте OperationTimeout

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

Если значение меньше, чем maxBackoff затем установите OperationTimeout выше maxBackoff

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

после создания MessageFactory

+0

Да, я прочитал, что, как указано в вопросе, я подтвердил, что IsTransient истинно , Исключения, которые мы тестируем, - это MessagingExceptions (хотя в приведенном примере кода я использовал общий). –

+0

MaxBackoff больше, чем OperationTimeout (по умолчанию одна минута), установите OperationTimeout больше, чем maxBackoff в MessagingFactorySettings – Raj

+0

Я сделал обновление для OperationTimeout, как было предложено, но поведение такое же. Повторения никогда не происходит. –

0

Я нашел этот блог:

правой кнопкой мыши проект в обозревателе решений и выберите Управление NuGet пакетов. Введите Обработку переходных процессов в поле поиска и нажмите «Поиск». Выберите «Корпоративная библиотека» - пакет приложений Application Transaction Fault. После нажатия кнопки «Установить» в проект будет добавлен набор необходимых сборок и ссылок, которые поддерживают блок приложений обработки переходных ошибок.

После реализации интерфейса я смог успешно выполнить политику повтора.

Я все еще не уверен, почему дефолт не работает.

Смежные вопросы