Служебная шина Azure отменяет запланированную синхронизацию сообщений — не удается перехватить исключение MessageNotFoundException, когда порядковый номер больше не существует

#azureservicebus

Вопрос:

Я планирую использовать сообщения служебной шины Azure с помощью ScheduleMessageAsync .

 var sequenceNumber = await sender.ScheduleMessageAsync(message, sendMessageOn)
 

Иногда мне нужно отменить эти сообщения. Я делаю это, звоня CancelScheduledMessageAsync .

 await sender.CancelScheduledMessageAsync(sequenceNumber)
 

Иногда sequenceNumber это больше не действует (сообщение уже было поставлено в очередь и т. Д.). Чтобы обработать эти исключения, я обертываю вызов CancelScheduledMessageAsync в try catch фильтр исключений для MessageNotFoundException .

 try {
    await sender.CancelScheduledMessageAsync(sequenceNumber)
} catch (Exception ex) when (ex is MessageNotFoundException) {
   _logger.LogError("Ignored MessageNotFoundException)
}
 

Это не работает. Исключение создается, но блок catch никогда не выполняется.

 Azure.Messaging.ServiceBus.ServiceBusException: Messages not found. One or more sequence numbers missing. ... (MessageNotFound)
 

Удаление фильтра исключений, чтобы я улавливал все исключения, работает, что говорит о том, что я фильтрую неправильное исключение, но я так не думаю.

Надеюсь, я просто слишком устал и упускаю из виду очевидное.

Ответ №1:

Проблема в том, что MessageNotFoundException это часть Microsoft.Azure.ServiceBus , но я использую Azure.Messaging.ServiceBus . Ибо Azure.Messaging.ServiceBus следующее делает свое дело:

 try {
    await sender.CancelScheduledMessageAsync(sequenceNumber)
} catch (ServiceBusException ex) when (ex.Reason == ServiceBusFailureReason.MessageNotFound) {
   _logger.LogError("Ignored MessageNotFoundException)
}
 

Обратите внимание на изменение фильтра исключений. Вместо того , чтобы ловить или фильтровать дальше MessageNotFoundException , мы ловим ServiceBusException и фильтруем дальше ServiceBusException.Reason .