gpt4 book ai didi

c# - MessageLockLostException : The lock supplied is invalid. 锁已过期,或者消息已从队列中删除

转载 作者:行者123 更新时间:2023-12-03 05:34:35 30 4
gpt4 key购买 nike

我正在尝试使用服务总线队列触发器使用队列中的消息并执行一些需要一些时间才能完成的工作。我不希望其他处理器在我处理消息时选取该消息。我在 host.json 中有以下配置。当我在 await receive.CompleteAsync(lockToken); 处收到来自队列的消息时我收到异常“提供的锁无效。锁已过期,或者消息已从队列中删除。”

 "serviceBus": {
"prefetchCount": 1,
"autoRenewTimeout": "00:05:00",
"messageHandlerOptions": {
"autoComplete": false,
"maxConcurrentCalls": 1,
"maxAutoRenewDuration": "00:04:00"
}
}

Azure Function 的代码如下

 public static void Run([ServiceBusTrigger("testqueue", Connection = "AzureServiceBus.ConnectionString")]Message message, MessageReceiver messageReceiver,ILogger log)
{
log.LogInformation($"C# ServiceBus queue trigger function processed message: {messageReceiver.ClientId}");
log.LogInformation($"Message={Encoding.UTF8.GetString(message.Body)}");
string lockToken = message.SystemProperties.LockToken;
log.LogInformation($"Processing Message:={Encoding.UTF8.GetString(message.Body)}");
DoSomeJob(messageReceiver, lockToken,log);
}
public static async void DoSomeJob(MessageReceiver receiver,string lockToken, ILogger log)
{
try
{

await Task.Delay(360000);
await receiver.CompleteAsync(lockToken);

}
catch (Exception ex)
{

log.LogInformation($"Error In Job={ex}");
}

}

最佳答案

当您配置由 Azure 服务总线触发的 Azure Function 并将 maxAutoRenewDuration 设置为 10 分钟时,您要求触发器将锁定延长最多 10 分钟。这是有保证的操作,因为它是由客户端发起的,并且最大单次锁定时间为 5 分钟。鉴于此,扩展锁的操作可能会失败并且锁将被释放,导致函数的另一个实例同时处理它,而原始处理仍在进行。

另一个需要注意的方面是 prefetchCount 设置为 100,maxConcurrentCalls 设置为 32。这意味着您正在获取 -最多 100 条消息并处理最多 32 条。我不知道实际的函数代码运行时间是否超过 50 秒(在您的示例中),但预取的消息锁不会自动更新。因此,如果预取消息在队列的 MaxLockDuration 时间(默认情况下小于 5 分钟)内没有得到处理,则其中一些预取消息将在完成后开始处理、可选更新和完成方式失去了锁。

我推荐:

  1. 检查 MaxLockDuration 不要太短以适应您的预取和并发。
  2. 更新 prefetchCount 以确保不会过度获取。
  3. 如果单条消息处理可以在 5 分钟或更短的时间内完成,那么更喜欢这样做,而不是自动续订。

关于c# - MessageLockLostException : The lock supplied is invalid. 锁已过期,或者消息已从队列中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63576127/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com