#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
.