我在我的visual解决方案中添加了一个项目,它是一个服务总线主题触发函数。我运行的应用程序与默认代码,但面临的问题。每当我向服务总线主题添加消息时,我的触发器每条消息执行5-6次,最后得到以下错误。
错误
提供的锁无效。要么锁过期了,要么消息已经从队列中删除。
我的代码:
[FunctionName("TopicFunction1")]
public static void Run(
[ServiceBusTrigger("myservicebustopicname", "subscriptionname", Connection = "ServiceBus_NS_ConnectionString")]string message,
Int32 deliveryCount,
ILogger log)
{
log.LogInformation($"ServiceBus topic trigger function processed message: {message}");
}送货数量达到5-6。
我检查了与这个问题有关的多个问题,它们没有帮助。下面就是一个例子。Azure函数Azure服务总线触发器两次
请帮我一下。
发布于 2020-07-06 09:39:13
有些事情要检查。所有参考资料都是参考文档。。
确保每次都是相同的消息,并且您不会通过注销消息ID来接收多个消息。
[FunctionName("ServiceBusQueueTriggerCSharp")]
public static void Run(
[ServiceBusTrigger("myqueue", Connection = "ServiceBusConnection")]
string myQueueItem,
Int32 deliveryCount,
DateTime enqueuedTimeUtc,
string messageId,
ILogger log)
{
log.LogInformation($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
log.LogInformation($"EnqueuedTimeUtc={enqueuedTimeUtc}");
log.LogInformation($"DeliveryCount={deliveryCount}");
log.LogInformation($"MessageId={messageId}");
}--如果您的函数抛出任何异常,则消息将重新尝试,但情况似乎并非如此。
最后,也很可能,如果您有两个函数应用程序或部署,并且它们被指向同一个队列,那么它们可能是相互竞争的--,下面复制的是消息的处理方式。你可能会有比赛状态。确保只运行一个实例,并且队列中没有其他代码竞争。
函数运行时以PeekLock行为模式接收消息。如果该函数成功完成,它将对消息调用Complete,如果函数失败,则调用fails。如果该函数运行的时间比PeekLock超时时间长,则只要该函数运行,锁就会自动更新。 maxAutoRenewDuration在映射到OnMessageOptions.MaxAutoRenewDuration的host.json中是可配置的。根据服务总线文档,此设置允许的最大时间为5分钟,而您可以将函数的时间限制从默认的5分钟增加到10分钟。对于服务总线函数,您不希望这样做,因为您将超过服务总线更新限制。
发布于 2021-02-23 13:37:18
如果您的"autoComplete": false文件中有host.json,那么消息将被处理,但不会自动从主题订阅中消失。类似于这个host.json文件:
{
"version": "2.0",
"extensions": {
"serviceBus": {
"messageHandlerOptions": {
"autoComplete": false
}
}
}
}删除autoComplete或将其设置为true应使函数从主题订阅中删除已成功处理的消息。
如果您需要更多的控制,并且不能使用autoComplete特性,那么可以通过添加一个MessageReceiver参数显式地完成消息,并为Message对象调用CompleteAsync,如下所示:
[FunctionName("TopicFunction1")]
public static async Task Run(
[ServiceBusTrigger("myservicebustopicname", "subscriptionname", Connection = "ServiceBus_NS_ConnectionString")]Message message,
MessageReceiver messageReceiver,
ILogger log)
{
log.LogInformation($"ServiceBus topic trigger function processed message: {message}");
await messageReceiver.CompleteAsync(message.GetLockToken());
}https://stackoverflow.com/questions/62752905
复制相似问题