我有一个如下所示的 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/