尝试完成消息时出现 Azure 服务总线异常

Azure service Bus Exception on trye to complete message

我正在使用 GitHub 示例来处理主题的消息:

private void RegisterSubscriptionClientMessageHandler()
        {
            _subscriptionClient.RegisterMessageHandler(
                async (message, token) =>
                {
                    var eventName = $"{message.Label}{INTEGRATION_EVENT_SUFIX}";
                    var messageData = Encoding.UTF8.GetString(message.Body);
                    await ProcessEvent(eventName, messageData);

                    // Complete the message so that it is not received again.
                    await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);
                },
               new MessageHandlerOptions(ExceptionReceivedHandler) { MaxConcurrentCalls = 10, AutoComplete = false });
        }

所有订阅者都成功发送和接收了所有消息,但是在命令中:

await _subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);

总是出现以下错误:

 ERROR ON ExceptionReceivedHandler EXEPTION: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue, or was received by a different receiver instance.
Bazinga.EventBus.Bus.EventBusSubscription:Error: ERROR ON ExceptionReceivedHandler EXEPTION: The lock supplied is invalid. Either the lock expired, or the message has already been removed from the queue, or was received by a different receiver instance.
- Executing Action: UserCallback

有什么解决办法吗?谢谢!

当从服务总线队列或主题订阅接收到消息时,锁定令牌将随消息一起返回。

锁定令牌可用于删除、死信或延迟消息。

每个队列和主题订阅都有锁定持续时间 属性。根据为 Lock duration 配置的时间跨度,随消息提供的锁将过期。

在这里,您在完成消息之前正在做一些处理await ProcessEvent(eventName, messageData);

问题一定是锁在_subscriptionClient.CompleteAsync(message.SystemProperties.LockToken);行执行前过期了。

增加锁定持续时间或在调用 ProcessEvent 之前完成消息将解决您的问题。

另一个主要原因是 Autocomplete 默认启用。

每当您使用 CompleteAsync() 时,您还应该实例化一个 OnMessageOptions 对象,以便将集合 AutoComplete 设置为 false,并将其传递到您的 OnMessage 调用中。

OnMessageOptions onMessageOpt = new OnMessageOptions();
onMessageOpt.AutoComplete = false;

client.OnMessage(processCalculations, options);

看到这个