![](/img/trans.png)
[英]Messages processing policy for Service Bus connector in Azure Logic App
[英]Azure functions app and Web jobs with service bus triggers missing some messages while processing
我正在从事 azure 函数和 azure web 工作。
我想要做的是,将消息发送到服务总线主题,然后从那里处理消息,如下所示,
他们都在使用 azure 服务总线触发器。
因此,如果一秒钟内的消息数量非常少,例如 1 到 5,它将被处理。 但是,如果我同时发送 30-40 条消息,函数应用程序和 Web 作业都缺少一些消息,我的意思是如果我发送 30 条消息并检查 blob,它会显示仅收到 25 条消息。
但是,当我添加一个按时间触发器运行的 azure 函数应用程序时,它可以完美地处理 30 次发送 -30 次处理,但我真的不想使用时间触发器,因为它在一天内点击了太多次。
如果有人可以帮助我,那就太好了。
功能触发:
public static void ProcessArchiveQueueMessage([ServiceBusTrigger("*****", "*****", Connection = "ServiceBusConnectionString")] string message, ILogger log)
{
ArchiveDll.ProcessArchiveTopic("****", log);
}
DLL代码:
subscriptionClient.OnMessageAsync(m =>
{
try
{
Stream stream = m.GetBody<Stream>();
StreamReader reader = new StreamReader(stream);
topicData = reader.ReadToEnd();
var jObj = JsonConvert.DeserializeObject<JObject>(topicData);
StoreJsoninBlob(cloudContainer, stream, jObj);
StoreInCosmosDB(log, jObj);
subscriptionClient.Complete(m.LockToken);
}
catch (Exception ex)
{
subscriptionClient.DeadLetter(m.LockToken);
}
return Task.CompletedTask;
}, new Microsoft.ServiceBus.Messaging.OnMessageOptions()
{
AutoComplete = false,
MaxConcurrentCalls = 1
});
}
catch (Exception e)
{
}
}
以下是我用来克服上述问题的最新代码。
public static void ProcessArchiveTopic(string subscriptionName, ILogger log, string message)
{
log.LogInformation("Registering message listener for " + subscriptionName);
//Below method is triggered every time when a new message is read from queue.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationSettings.AppSettings["BlobConnectionString"]);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer cloudContainer = blobClient.GetContainerReference(ConfigurationSettings.AppSettings["BlobContainerName"]);
cloudContainer.CreateIfNotExists();
try
{
#region"function app reading message"
log.LogInformation("Processing message for subscription: " + subscriptionName);
var jObj = JsonConvert.DeserializeObject<JObject>(message);
log.LogInformation("Converted message to Json");
#endregion
StoreJsoninBlob(cloudContainer, GenerateStreamFromString(message), jObj);
StoreInCosmosDB(log, jObj);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.