使Azure函数在ServiceBusTrigger上顺序运行-maxConcurrentCalls不起作用

时间:2018-08-17 18:04:20

标签: 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"
    }
}

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

2 个答案:

答案 0 :(得分:3)

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

  [Singleton(Mode = SingletonMode.Listener)]

此功能未记录在Function sdk中,但看起来仍然存在。这是webjobs文档。 Azure Web Jobs SDK Singleton

答案 1 :(得分:0)

与v1相比,使用功能v2-host.json服务总线绑定配置is different登陆此处的任何人。

例如:

{
    "version": "2.0",
    "extensions": {
        "serviceBus": {
            "prefetchCount": 100,
            "messageHandlerOptions": {
                "autoComplete": true,
                "maxConcurrentCalls": 32,
                "maxAutoRenewDuration": "00:05:00"
            },
            "sessionHandlerOptions": {
                "autoComplete": false,
                "messageWaitTimeout": "00:00:30",
                "maxAutoRenewDuration": "00:55:00",
                "maxConcurrentSessions": 16
            }
        }
    }
}