MessageReceiver.RegisterMessageHandler постоянно генерирует исключения, если сеть не работает - PullRequest
0 голосов
/ 13 июня 2018

Я успешно установил соединение с ServiceBus с MessageReceiver, используя RegisterMessageHandler, который запускает насос (из этого примера ), и все, кажется, работает просто отлично.

Но вслучай исключения, например, когда я отключаю сетевое соединение, насос непрерывно выбрасывает исключения в ExceptionHandler.Каждую секунду или даже быстрее.Мне интересно, если это предполагаемое поведение по умолчанию и, что более важно, если это возможно изменить, так что, например, повторные попытки подключения могут происходить каждую 1 минуту.Или я должен сделать Thread.Sleep или что-то для этого?

receiver.RegisterMessageHandler(
    async (message, cancellationToken1) => await HandleMessage(receiver, message),
    new MessageHandlerOptions(HandleException)
    {
        AutoComplete = false, 
        MaxConcurrentCalls = 1
    });

PS Вот как я решил это сейчас, но не уверен, что это правильный путь:

private Task HandleException(ExceptionReceivedEventArgs args)
{
    _logger.Error(...);
     return Task.Delay(60000);
}

PS Вот дамп RetryPolicy.Default:

enter image description here

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Попробуйте настроить «RetryExponential» на «SubscriptionClient» следующим образом:

var receiver = new Microsoft.Azure.ServiceBus.SubscriptionClient(_serviceBusConnString, _topic, _subscription, this._receiveMode, new RetryExponential(TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10), _retryPolicyMaximumRetryCount));

Это описание параметров:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.servicebus.retryexponential?view=azure-dotnet

Здесь другиесообщение о том, что означают свойства:

Значения свойства ServiceBus RetryExponential

0 голосов
/ 13 июня 2018

У служебной шины Azure есть политика повторов по умолчанию (RetryPolicy.Default), но, поскольку транспорт пытается получить сообщения, а посредник недоступен, возникнут исключения.

ExceptionReceivedContext предоставляет контекст,ExceptionReceivedContext с действием, которое не удалось, и исходное исключение.Вы можете оценить действие и решить, что нужно сделать.Вы также можете проверить, является ли исключение временным или нет.Для временных ошибок, основанных на действии, вы можете просто подождать, пока сообщение не будет повторено позже (действие Receive).В других случаях вы можете либо зарегистрировать ошибку, либо предпринять более конкретное действие.

...