Обработчик Rebs не повторяет попытку при возникновении исключения

Я использую rebus 3.1.5 с rebus.rabbitmq 3.0.0 и rabbitmq.client 4.1.1. Я настроил использовать простую стратегию повторных попыток с 2 максимальными попытками доставки. Я хотел бы повторить сообщение в случае возникновения исключения. Я не использую объем транзакции. Но когда выдается исключение, я не получаю сообщение повторно повторно (оно даже не находится в очереди ошибок)

Если это невозможно, и если мне нужно настроить ребус с помощью HandleMessagesInsideTransactionScope, он будет блокировать мою базу данных, пока я не завершу работу с обработчиком?

Большое спасибо!

РЕДАКТИРОВАТЬ: Вот как выглядит обработчик:

public Task Handle(SetCreditInfoCommand command) 
{
    return Task.Run(() => {
        var loanApplication = _loanApplicationRepository.Get(command.LoanApplicationId); 
        try { 
            //something that throws an exception here
        }
        catch(Exception ex)
        {
            throw ex;
        }
    });
} 

и вот как настроена шина:

var bus = Configure.With(adapter)
    .Transport(t => t.UseRabbitMq(connectionString, queueName))
    .Options(b => b.SimpleRetryStrategy(
            maxDeliveryAttempts: 2,
            secondLevelRetriesEnabled: true, 
            errorQueueAddress: queueName + "_error"
    ))
    .Timeouts(t => t.StoreInSqlServer(dbConnection, "RebusTimeouts", false))
    .Start();

IoC.GetContainerBuilder().RegisterInstance(bus).As<IBus>(); 

1 ответ

Решение

Я не использую объем транзакции

Хорошо - область транзакции доступна только в том случае, если вы хотите сгруппировать несколько операций шины вместе вне обработчика Rebus, например, при обработке веб-запроса.

Все, что происходит в обработчике Rebus, автоматически группируется и фиксируется как часть контекста транзакции, который охватывает обработку входящего сообщения.

РЕДАКТИРОВАТЬ: Автор вопроса имел в виду System.Trasactions.TransactionScope, который Rebus может автоматически применять к обработчикам сообщений с помощью пакета https://www.nuget.org/packages/Rebus.TransactionScopes/.

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

когда выдается исключение, я не получаю сообщение повторно повторно (даже в очереди ошибок)

Это звучит странно. Вы позволяете исключению пузыриться из обработчика сообщений?


Я добавил код из ваших комментариев к вашему вопросу - его намного проще читать таким образом:)

Прежде всего, я предлагаю вам упростить ваш код с помощью async Ключевое слово в объявлении метода, как это:

public async Task Handle(SetCreditInfoCommand command) 
{
    // (...)
} 

Далее я рекомендую вам сделать сейчас throw exпотому что это не правильная переброска - это испортит след стека ex исключение.

Вам следует

catch(Exception ex)
{
    throw;
}

если вы абсолютно хотите поймать исключение. Но я действительно рекомендую вам НЕ перехватывать исключения в ваших обработчиках Rebus, если вы не хотите с ними что-то делать - в этом случае мне кажется, что ваш обработчик будет лучше, как это:

public async Task Handle(SetCreditInfoCommand command) 
{
    var loanApplication = _loanApplicationRepository.Get(command.LoanApplicationId); 

    //something that throws an exception here
} 

потому что это намного понятнее.

Повторные попытки второго уровня работают нормально, но повторные попытки не работают

Таким образом, похоже, что Ребус прыгает прямо на повторные попытки второго уровня? Можете ли вы рассказать мне больше о том, как вы это поняли?

Другие вопросы по тегам