首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure函数服务总线触发器多次运行

Azure函数服务总线触发器多次运行
EN

Stack Overflow用户
提问于 2020-07-06 09:17:22
回答 2查看 4K关注 0票数 5

我在我的visual解决方案中添加了一个项目,它是一个服务总线主题触发函数。我运行的应用程序与默认代码,但面临的问题。每当我向服务总线主题添加消息时,我的触发器每条消息执行5-6次,最后得到以下错误。

错误

提供的锁无效。要么锁过期了,要么消息已经从队列中删除。

我的代码:

代码语言:javascript
复制
[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服务总线触发器两次

请帮我一下。

EN

回答 2

Stack Overflow用户

发布于 2020-07-06 09:39:13

有些事情要检查。所有参考资料都是参考文档。

确保每次都是相同的消息,并且您不会通过注销消息ID来接收多个消息。

代码语言:javascript
复制
[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分钟。对于服务总线函数,您不希望这样做,因为您将超过服务总线更新限制。

票数 2
EN

Stack Overflow用户

发布于 2021-02-23 13:37:18

如果您的"autoComplete": false文件中有host.json,那么消息将被处理,但不会自动从主题订阅中消失。类似于这个host.json文件:

代码语言:javascript
复制
{
  "version": "2.0",
  "extensions": {
    "serviceBus": {
      "messageHandlerOptions": {
        "autoComplete": false
      }
    }
  }
}

删除autoComplete或将其设置为true应使函数从主题订阅中删除已成功处理的消息。

如果您需要更多的控制,并且不能使用autoComplete特性,那么可以通过添加一个MessageReceiver参数显式地完成消息,并为Message对象调用CompleteAsync,如下所示:

代码语言:javascript
复制
[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());
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62752905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档