azureservicebus - 为什么消息锁过期后Azure Servicebus触发函数立即调用?
问题描述
我有一个带有服务总线绑定的 Azure 函数。服务总线上的Message Lock Duration
主题是3 minutes
和Delivery Count
。5
有时,即使在第一次触发调用成功完成后,也会触发该函数。没有额外的配置是通过设置hosts.json
我已配置 Application Insights,但跟踪没有意义。第一次调用在 90 秒内完成,但第二次调用在第一次调用的锁定期到期后 3 毫秒触发。
如何确定根本原因?
解决方案
我使用您的服务总线订阅的设置。但我无法重现您的问题。
这是我的代码:
using System;
using System.Threading.Tasks;
using System.Threading;
public static void Run(string mySbMsg, ILogger log)
{
log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg} started.");
Thread.Sleep(90 * 1000);
log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg} ended.");
}
以及我的服务总线订阅的设置:
我发送了三个消息:test1、test2、test3(此时消息还在订阅中。)。
大约 90 秒后,我得到:
在此之后,消息已被删除。
以上是测试结果。
即使从理论上分析,也不应该出现你提到的这种情况。您的锁定时间为 3 分钟,因此大于函数运行时间。而且你还没有改变host.json,所以整个执行应该是这样的:
该函数基于peek方法获取信息(因此该信息在函数结束之前继续存在于服务总线中。),并在您给定的锁定时间内完成逻辑。由于 host.json 没有改变,'extensions.serviceBus.messageHandlerOptions.autoComplete' 的值为'true'。Azure 函数在逻辑完成时自动调用 complete 方法完成信息,并将信息从服务总线中移除。
我怀疑你犯了一个错误。你确定你的函数收到的两条消息是一样的吗?如果是,那么您提供的信息可能不完整,我无法根据您提供的条件重现您的问题。上面函数的全部执行逻辑我都写好了。
推荐阅读
- excel - 如何结合两个搜索框的调查?
- javascript - 本次计算中 Macrotask 和 Microtask 队列的状态
- java - JMeter - Velocity JSR223 脚本不能使用 JMeter 变量/环境
- c++ - 尝试“复制”shared_ptr 向上转换行为会导致复制构造函数的无限递归(导致段错误)
- angular - 不稳定的 maven-dependency-plugin(特定文件夹并不总是生成/包含在 .jar 文件中)
- javascript - 仅在使用 jquery 的鼠标按下事件时更改元素 css
- calculation - 如何从 CalculationResultView 类调用自定义方法
- sql-server - 如何在 SQL Server 2017 的全文搜索中使用反引号
- jquery - 可滚动 div 问题中的可拖动/多个 droppables
- angular - 在 Angular 7 中实例化 thrift 生成的对象