2016-08-21 5 views
0

Я использую Azure WebJobs для опроса очереди и обработки этого сообщения.Как удалить сообщение очереди Azure WebJobs из очереди Azure?

Часть обработки сообщений включает в себя попадание на стороннюю конечную точку HTTP. (например, Weather api или некоторый фондовый рынок api).

Теперь, если сбой на api не удается (ошибка сети, ошибка 500, что угодно) Я пытаюсь/поймаю это в своем коде, записываю все, а потом ... что ???

Если я продолжу .. то I предположим, что сообщение будет удалено с помощью WebJobs SDK.

Как я могу:

1) Скажите SDK - пожалуйста, не удаляйте это сообщение (так он будет повторен автоматически при следующем опросе очереди и когда сообщение отображается снова).
2) Установите значение времени невидимости, когда SDK выдает сообщение из очереди для обработки.

Спасибо!

+0

на основе содержания, размещенных здесь https://azure.microsoft.com/en-in/documentation/articles/websites-dotnet-webjobs-sdk-storage-queues-how -to/# poison, я считаю, что сообщение не удаляется, если ваша функция вызывает ошибку. Можете ли вы попробовать, зарегистрировав исключение, а затем перевернув это исключение? –

+0

Предполагая, что вы не продолжаете/обрабатываете ошибку, но разрешаете ей сбой - и если ваш запрос выходит из строя более чем в 5 раз - сообщение помещается в другую очередь, что называется 'posion - {{your_queue_name}}' - вы можете написать прослушиватель прослушивание этой очереди для обработки неудавшегося сообщения. Пожалуйста, уточните, что вы подразумеваете под значением невидимости? Вы имеете в виду замок. – Jaya

+0

@JS_GodBlessAll Чтение документации, '5' является значением по умолчанию для числа попыток, но настраивается. Если мы установим это значение на действительно высокое число, сообщение не будет перемещаться в очередь на яд (см. Раздел «Обработка ядовитых сообщений»). Я прав? –

ответ

5

Теперь, если попадание в API не удается (ошибка сети, ошибка 500, что угодно) Стараюсь/поймать это в моем коде, бревенчатое все, а потом ... что ??

Webjobs SDK ведет себя следующим образом: Если ваш метод попадает на кочку (исключение), сообщение возвращается в очередь с его dequeueCount собственности +1. В противном случае, если все хорошо, то сообщение считается успешно обработан и удаляется из очереди - т.е. queue.DeleteMessage(retrievedMessage);

Так что не корректно поймать HTTP 500, сгенерирует исключение, так что SDK получает подсказку.

Если я продолжу .. то я предполагаю, что сообщение будет удалено с помощью SDK WebJobs.

От https://github.com/Azure/azure-content/blob/master/articles/app-service-web/websites-dotnet-webjobs-sdk-get-started.md#contosoadswebjob---functionscs---generatethumbnail-method:

Если метод не до завершения, сообщение очереди не удаляется; после истечения 10-минутной аренды сообщение будет выпущено, чтобы его снова подхватили и обработали. Эта последовательность не будет повторяться бесконечно, если сообщение всегда вызывает исключение. После 5 неудачных попыток обработки сообщения сообщение перемещается в очередь с именем {queuename}-poison. Максимальное количество попыток настраивается.

Если вы действительно не нравится жёстко прописанные 10 минут таймаут видимости (время сообщение остается скрыто от потребителей), вы можете изменить его. Смотрите этот ответ на @mathewc:

От https://stackoverflow.com/a/34093943/4148708:

В последней версии v1.1.0, теперь вы можете управлять временем ожидания видимости зарегистрировав свой собственный QueueProcessor экземпляры через JobHostConfiguration.Queues.QueueProcessorFactory.Это позволяет вам управлять расширенным поведением обработки сообщений глобально или для каждой очереди/функции.

https://github.com/Azure/azure-webjobs-sdk-samples/blob/master/BasicSamples/MiscOperations/CustomQueueProcessorFactory.cs#L63

protected override async Task ReleaseMessageAsync(CloudQueueMessage message, FunctionResult result, TimeSpan visibilityTimeout, CancellationToken cancellationToken) 
{ 
     // demonstrates how visibility timeout for failed messages can be customized 
     // the logic here could implement exponential backoff, etc. 
     visibilityTimeout = TimeSpan.FromSeconds(message.DequeueCount); 

     await base.ReleaseMessageAsync(message, result, visibilityTimeout, cancellationToken); 
} 
Смежные вопросы