Пример функции Azure в .NET 5, использующей IAsyncCollectorдля записи нескольких сообщений в служебную шину

#azure-functions #.net-5 #azure-servicebus-queues

Вопрос:

Может ли кто-нибудь предоставить пример кода для функции Azure в .NET 5, которая использует IAsyncCollector для добавления нескольких сообщений в служебную шину?

Ответ №1:

IAsyncCollector в настоящее время не поддерживается с помощью пакета SDK для внепроцессных / рабочих процессов в соответствии с документацией:

Потому что.В изолированных проектах, выполняемых в отдельном рабочем процессе, привязки не могут использовать преимущества богатых классов привязки, таких как ICollector, IAsyncCollector и CloudBlockBlob. Также отсутствует прямая поддержка типов, унаследованных от базовых пакетов SDK служб, таких как DocumentClient и BrokeredMessage. Вместо этого привязки основаны на строках, массивах и сериализуемых типах, таких как простые старые объекты класса (POCOs).

В документации неясно, как этого добиться. Эта проблема подчеркивает, что с помощью выделенного класса с ServiceBusOutput атрибутом свойства коллекции можно отправлять сериализованные несколько значений в виде отдельных сообщений. Например:

 [Function("OneToMany")]
public static DispatchedMessages Run([ServiceBusTrigger("myqueue",
    Connection = "AzureServiceBus")] string myQueueItem,
    FunctionContext context)
{
    // Generate 5 messages
    var messages = new List<MyMessage>();
    for (var i = 0; i < 5; i  )
    {
        var message = new MyMessage { Value = $"Message #{i}" };
        messages.Add(message);
    }

    return new DispatchedMessages
    { 
        Messages = messages.Select(x => JsonSerializer.Serialize(x)) 
    };
}
 

Где каждое сообщение будет иметь тип MyMessage :

 class MyMessage
{
    public string Value { get; set; }
}
 

И функция вернет его как DispatchedMessages тип, обладающий свойством Messages , которое будет представлять все сообщения, которые необходимо отправить в виде сериализованных строк:

 public class DispatchedMessages
{
    [ServiceBusOutput(queueOrTopicName: "dest", Connection = "AzureServiceBus")]
    public IEnumerable<string> Messages { get; set; }
}
 

Обратите внимание, что имя строки подключения необходимо, так как по умолчанию функции SDK будут пытаться использовать AzureWebJobsServiceBus имя строки подключения.

Как только функция будет завершена, в очереди будет 5 сообщений dest с содержимым JSON сериализованных MyMessage сообщений.

состояние очереди
текст сообщения