异步ServiceBusTrigger

时间:2019-05-06 21:06:31

标签: c# azure azure-functions azure-servicebus-queues

我正在使用包含基于ServiceBusTrigger的Azure函数的微服务(使用Azure Function应用程序),当将消息插入 Service Bus队列 时触发。

我正在尝试确定将输出值绑定到多个目标的最佳方法(例如CosmosDB IoT中心)。该方法是否标记为异步将决定我应该如何解决此问题。

据我所知,通常使用异步功能处理输出绑定的方式是使用[return: ...]批注;但是,在我的用例中,我需要将两个不同的值返回到两个单独的目标(例如CosmosDb和IoT中心)。我不认为这是我可以通过返回值绑定或输出变量绑定来实现的,因为您不能通过async方法使用out参数,而可以使用{{ 1}}方法。

似乎唯一的选择(如果我走了异步路由)将是在Azure函数中手动调用SDK方法,以独立于任何输出值来调用服务。我试图避免这样做,因为将输出绑定视为首选方法。

我在创建基于[return: ...]的全新Azure函数时发现,默认情况下将生成的方法签名标记为ServiceBusTrigger

这不同于async,后者被标记为HttpTrigger,是开箱即用的。

有人可以帮助我了解原因吗?一种与另一种相关的缩放含义是什么?

从传统意义上来说,我理解为什么您通常将async标记为异步;但是,我不了解为何HttpTrigger不异步

的原因

在巩固我的输出方法之前,我需要了解这一点。

1 个答案:

答案 0 :(得分:1)

我认为带有/不带有async函数的模板对它们没有任何理由。并且根据您的代码,您的功能可能会更高效。
请阅读this thread,以获取有关函数中的async/await的更多信息。

关于您的主要问题,您只需绑定到CosmosDB和IoT中心输出绑定的不同对象。

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

namespace CosmosDBSamplesV2
{
    public static class WriteDocsIAsyncCollector
    {
        [FunctionName("WriteDocsIAsyncCollector")]
        public static async Task Run(
            [QueueTrigger("todoqueueforwritemulti")] ToDoItem[] toDoItemsIn,
            [CosmosDB(
                databaseName: "ToDoItems",
                collectionName: "Items",
                ConnectionStringSetting = "CosmosDBConnection")]
                IAsyncCollector<ToDoItem> toDoItemsOut,
            ILogger log)
        {
            log.LogInformation($"C# Queue trigger function processed {toDoItemsIn?.Length} items");

            foreach (ToDoItem toDoItem in toDoItemsIn)
            {
                log.LogInformation($"Description={toDoItem.Description}");
                await toDoItemsOut.AddAsync(toDoItem);
            }
        }
    }
}
[FunctionName("EH2EH")]
public static async Task Run(
    [EventHubTrigger("source", Connection = "EventHubConnectionAppSetting")] EventData[] events,
    [EventHub("dest", Connection = "EventHubConnectionAppSetting")]IAsyncCollector<string> outputEvents,
    ILogger log)
{
    foreach (EventData eventData in events)
    {
        // do some processing:
        var myProcessedEvent = DoSomething(eventData);

        // then send the message
        await outputEvents.AddAsync(JsonConvert.SerializeObject(myProcessedEvent));
    }
}