我有一个看起来像这样的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()完成,直到从队列中提取新消息?
答案 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
}
}
}
}