c# - 使 Azure Function 在 ServiceBusTrigger 上顺序运行 - maxConcurrentCalls 不起作用

标签 c# azure azure-functions

我有一个如下所示的 Azure 函数

[FunctionName("Dispatcher")]
public static void Run([ServiceBusTrigger(queueName: "defaultqueue", Connection = "AzureWebJobsQueue")]string queueMessage, TraceWriter log)
{

    Dictionary<string, string> payload = JsonConvert.DeserializeObject<Dictionary<string, string>>(queueMessage);
    string url = payload["url"];

    try
    {
        log.Info("Collect result: " + url);

        using (HttpResponseMessage response = httpClient.GetAsync(url).Result)
        {
            int statusCode = (int)response.StatusCode;

            if (statusCode == 200)
            {
                var responseString = response.Content.ReadAsStringAsync().Result;
                DoStuff(log, responseString);
            }
        }
    }
}

HttpClient 上的 GET 大约需要一分钟。我想等待此调用完成,直到从服务总线队列检索到下一条消息。

我的 host.json 看起来像这样

{
    "functionTimeout": "23:00:00",
    "serviceBus": {
        "maxConcurrentCalls": 1,
        "prefetchCount": 1,
        "autoRenewTimeout": "00:05:00"
    }
}

但是,当我将消息放入服务总线队列并运行该函数时,我立即在日志中看到多个“收集结果:http://example.com”,这显然意味着该函数的多个实例正在并行运行。如何将 Azure Functions 配置为等到 HttpClient 和 DoStuff() 完成后才从队列中提取新消息?

最佳答案

我认为您仍然可以使用从网络作业移植的功能。为了在所有实例中只执行一次该函数,请将此属性放在您的方法之上。

  [Singleton(Mode = SingletonMode.Listener)]

这没有记录在 Functions sdk 中,但看起来仍然存在。这是 webjobs 文档。 Azure Web Jobs SDK Singleton

关于c# - 使 Azure Function 在 ServiceBusTrigger 上顺序运行 - maxConcurrentCalls 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51900791/

相关文章:

azure - 使用 Azure 函数绑定(bind)返回容器中的 Blob 列表

c# - 在 WPF ListView ItemTemplate 中查找子元素

c# - HttpWebRequest getRequestStream 在多次运行时挂起

c# - C# Graphics 对象的 Java 等价物是什么? (包括更多详细信息)

azure - 如何报告 Windows Server 服务总线中的错误?

database - 如何仅在 Azure Cosmos DB 中的文档创建(而不是修改)后触发 Azure 函数?

c# - 如何在Azure Functions V2中记录到azure应用程序日志?

C# 嵌套泛型在使用约束时区别对待

java - 访问 Azure Key Vault 进行本地开发

angular - 如何使从 azure 广告收到的 Jwt token 无效