Как корректно завершить работу функции Azure, активируемой служебной шиной

Я хочу использовать функции Azure для вызова конечных точек REST на основе сообщений очереди. Документация говорит мне...

Среда выполнения функций получает сообщение в режиме PeekLock и вызывает Complete для сообщения, если функция завершается успешно, или вызывает Abandon, если функция завершается со сбоем.

Следовательно, я пытаюсь вывести функцию из строя, создав исключение для хоста, чтобы отказаться от сообщения, когда вызов REST терпит неудачу.

using System;
using System.Text;
using System.Threading.Tasks;
using Microsoft.ServiceBus.Messaging;

public static void Run(BrokeredMessage message, TraceWriter log)
{
    string body = message.GetBody<string>();

    using (var client = new HttpClient())
    {
        var content = new StringContent(body, Encoding.UTF8, "application/json");
        var response = client.PutAsync("http://some-rest-endpoint.url/api", content).Result;
        if (!response.IsSuccessStatusCode)
        {
            throw new Exception("Message could not be sent");
        }
    }    
}

Кто-нибудь знает лучший способ изящно отказаться от функции?


person Kai Walter    schedule 08.10.2016    source источник
comment
Зарегистрируйте ошибку и вызовите message.Abandon() вручную.   -  person Nkosi    schedule 09.10.2016
comment
Кай, можешь уточнить, что ты имеешь в виду под изящным отказом функции? Приведенный выше шаблон хорошо работает с режимом совместной работы, который у вас есть с функциями, где сбой выполнения функции (который, по-видимому, является вашим сценарием) обрабатывается средой выполнения, а сообщения помещаются в правильное состояние. Есть ли проблема с текущим поведением?   -  person Fabio Cavalcante    schedule 10.10.2016
comment
Я изящно подумал о каком-то коде возврата или флаге в контексте экземпляра функции, который я мог бы установить. Я думаю, что создание исключения немного хакерское.   -  person Kai Walter    schedule 11.10.2016
comment
Спасибо @Nkosi - на данный момент это лучший подход.   -  person Kai Walter    schedule 27.10.2016


Ответы (1)


Зарегистрируйте ошибку и вызовите message.Abandon() вручную.

public static async Task RunAsync(BrokeredMessage message, TraceWriter log) {
    var body = message.GetBody<string>();

    using (var client = new HttpClient()) {
        var content = new StringContent(body, Encoding.UTF8, "application/json");
        var response = await client.PutAsync("http://some-rest-endpoint.url/api", content);
        if (!response.IsSuccessStatusCode) {
            log.Warning("Message could not be sent");
            await message.AbandonAsync();
        }
    }    
}
person Nkosi    schedule 27.10.2016