首页 > 解决方案 > Azure 服务总线 CancelScheduledMessageAsync - 当序列号不再存在时无法捕获 MessageNotFoundException

问题描述

我正在使用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)

删除异常过滤器以便我捕获所有异常有效,这表明我正在过滤错误的异常,但我不认为我是。

希望我只是太累了,忽略了显而易见的事情。

标签: azureservicebus

解决方案


问题是这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


推荐阅读