通过使用 Azure Functions 调用逻辑应用工作流来设置长时间运行的任务
适用于:Azure 逻辑应用(消耗)
当你需要部署长时间运行的侦听器或任务时,可以创建一个使用请求触发器的逻辑应用工作流,然后使用 Azure Functions 来调用该触发器并运行该工作流。
例如,可以创建一个函数来侦听进入 Azure 服务总线队列的消息。 发生此事件时,该函数会调用请求触发器,后者充当推送触发器来自动运行工作流。
本操作指南介绍如何创建一个通过请求触发器启动的逻辑应用工作流。 然后,你将创建一个侦听服务总线队列的函数。 当消息进入队列时,该函数将调用请求触发器创建的终结点来运行工作流。
注意
尽管你可以使用消耗或标准逻辑应用工作流来实现此行为,但此示例继续使用消耗工作流。
先决条件
Azure 帐户和订阅。 如果没有订阅,请创建试用帐户。
服务总线命名空间。 若没有命名空间,请先创建命名空间。 有关详细信息,请参阅什么是 Azure 服务总线?
函数应用,作为函数的容器。 如果你没有函数应用,请先创建函数应用,并确保为“运行时堆栈”属性选择“.NET”。
有关如何创建逻辑应用工作流的基本知识。 有关更多信息,请参阅在多租户 Azure 逻辑应用中创建“消耗”逻辑应用工作流。
创建逻辑应用工作流
在 Azure 门户中,通过选择“空白逻辑应用”模板创建消耗空白逻辑应用。
设计器打开后,在设计器搜索框下选择“内置”。 在搜索框中输入“请求”。
从触发器列表中选择名为“当收到 HTTP 请求时”的触发器。
使用请求触发器时,可以选择输入用于队列消息的 JSON 架构。 JSON 架构可帮助设计器理解输入数据的结构,并方便你在工作流中使用输出。
若要指定架构,请在“请求正文 JSON 架构”框中输入架构。
如果你没有架构,但有一个 JSON 格式的示例有效负载,则可以基于该有效负载生成一个架构。
在请求触发器中,选择“使用示例有效负载生成架构”。
在“输入或粘贴示例 JSON 有效负载”下,输入你的示例有效负载,然后选择“完成”。
前面描绘的示例有效负载生成以下架构,该架构将显示在触发器中:
{ "type": "object", "properties": { "address": { "type": "object", "properties": { "number": { "type": "integer" }, "street": { "type": "string" }, "city": { "type": "string" }, "postalCode": { "type": "integer" }, "country": { "type": "string" } } } } }
在触发器下,添加要用于处理收到的消息的任何其他操作。
例如,可以添加一个使用 Office 365 Outlook 连接器发送电子邮件的操作。
保存逻辑应用工作流。
此步骤为工作流中的请求触发器生成回调 URL。 随后,在用于 Azure 服务总线队列触发器的代码中使用此回调 URL。 此回调 URL 显示在 HTTP POST URL 属性中。
创建函数
接下来创建一个函数,用于侦听队列并在消息抵达时在请求触发器上调用终结点。
在 Azure 门户中,打开函数应用。
在函数应用导航菜单中选择“函数”。 在“函数”窗格中选择“创建”。
在“选择模板”下,选择名为“Azure 服务总线队列触发器”的模板。 在“模板详细信息”部分出现后(其中会根据所选的模板显示不同的选项),请提供以下信息:
属性 价值 说明 新建函数 <function-name> 输入函数的名称。 服务总线连接 <Service-Bus-connection> 选择“新建”,为服务总线队列设置使用服务总线 SDK OnMessageReceive()
侦听器的连接。队列名称 <queue-name> 输入队列的名称。 完成操作后,选择“创建”。
Azure 门户现在会显示新 Azure 服务总线队列触发器函数的“概述”页。
现在,编写一个基本函数来调用前面创建的逻辑应用工作流的终结点。 在编写该函数之前,请查看以下注意事项:
使用队列中的消息触发函数。
考虑到函数可能并发运行、量大或负载大,请避免使用
using
语句实例化 HTTPClient 类,并避免直接按请求创建 HTTPClient 实例。 有关详细信息,请参阅使用 HttpClientFactory 实现可复原的 HTTP 请求。可能情况下,重复使用 HTTP 客户端的实例。 有关详细信息,请参阅在 Azure Functions 中管理连接。
以下示例以异步模式使用
Task.Run
方法。 有关详细信息,请参阅使用 async 和 await 进行异步编程。 该示例还使用application/json
消息内容类型,但你可以根据需要更改此类型。using System; using System.Threading.Tasks; using System.Net.Http; using System.Text; // Set up the URI for the logic app workflow. You can also get this value on the logic app's 'Overview' pane, under the trigger history, or from an environment variable. private static string logicAppUri = @"https://prod-05.chinanorth.logic.azure.cn:443/workflows/<remaining-callback-URL>"; // Reuse the instance of HTTP clients if possible. For more information, see /azure-functions/manage-connections. private static HttpClient httpClient = new HttpClient(); public static async Task Run(string myQueueItem, TraceWriter log) { log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}"); var response = await httpClient.PostAsync(logicAppUri, new StringContent(myQueueItem, Encoding.UTF8, "application/json")); }
测试逻辑应用工作流
若要进行测试,请使用以下步骤或其他工具将消息添加到服务总线队列:
在 Azure 门户中,打开你的服务总线命名空间。
在服务总线命名空间导航菜单中选择“队列”。
选择先前使用服务总线连接链接到函数的服务总线队列。
在队列导航菜单中选择“Service Bus Explorer”,然后在工具栏上选择“发送消息”。
在“发送消息”窗格中,指定要发送到服务总线队列的消息。
此消息将触发逻辑应用工作流。