У меня есть функция веб-задания Azure, которая прослушивает сообщения в очереди Azure ServiceBus. Обычно, когда я сталкиваюсь с исключением в моем коде, сообщение прекращается в соответствии с документацией Azure WebJobs SDK :
SDK получает сообщение в режиме PeekLock и вызывает сообщение Complete в случае успешного завершения функции или вызывает Abandon в случае сбоя функции. Если функция работает дольше, чем время ожидания PeekLock, блокировка автоматически возобновляется.
В соответствии с документацией Azure ServiceBus это должно означать, что сообщение снова станет доступным и будет повторено:
Если приложение по какой-то причине не может обработать сообщение, оно может вызвать метод AbandonAsync для полученного сообщения (вместо CompleteAsync). Этот метод позволяет служебной шине разблокировать сообщение и сделать его доступным для повторного получения тем же потребителем или другим конкурирующим потребителем. Во-вторых, есть тайм-аут, связанный с блокировкой, и если приложению не удается обработать сообщение до истечения времени ожидания блокировки (например, в случае сбоя приложения), то служебная шина разблокирует сообщение и делает его доступным для повторного приема (по существу выполнение операции AbandonAsync по умолчанию).
Поведение, описанное выше, обычно происходит, но я нашел исключение из этого правила. Если мой код выбрасывает TaskCanceledException
, сообщение не прекращено, как следует:
public void ProcessQueueMessage([ServiceBusTrigger("queue")] BrokeredMessage message, TextWriter log)
{
throw new TaskCanceledException();
}
При запуске этой функции через веб-задание я вижу сообщение об ошибке, распечатанное как день, но сообщение используется без повторных попыток и без входа в очередь недоставленных сообщений. Если я заменю TaskCanceledException
выше на InvalidOperationException
, сообщение будет удалено и повторено, как и должно (я проверил это по фактической очереди ServiceBus).
Мне не удалось найти объяснения этому поведению. В настоящее время я обертываю TaskCanceledException
в другое исключение, чтобы обойти проблему.
Вопрос
В чем проблема с SDK Azure WebJobs? Является ли TaskCanceledException
особенным в этом отношении, или другие типы исключений имеют аналогичное поведение?
Я использую следующие пакеты NuGet:
- Microsoft.Azure.WebJobs 2.3.0
- Microsoft.Azure.WebJobs.ServiceBus 2.3.0