【问题标题】:Azure service Bus Exception on trye to complete message尝试完成消息时出现 Azure 服务总线异常
【发布时间】:2019-02-09 15:41:55
【问题描述】:

我正在使用 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

关于如何解决的任何提示?谢谢!

【问题讨论】:

  • 您确定邮件还在队列中吗?错误消息说队列中没有消息
  • @Jayendran - 谢谢,好问题:我怎样才能准确有效地验证这一点?
  • 我已经提供了我的答案。此外,对于您的问题,您可以检查 Azure 门户以检查您的消息是否在队列/主题中(或者)您可以使用 Azure Service Bus Explorer 来验证
  • 有什么更新吗?您是否发现该解决方案有用,然后投票/接受答案,以便对社区有所帮助
  • 抱歉耽搁了......发布的解决方案都没有奏效。我仍然有同样的问题。我正在研究文档以试图找出我做错了什么。随时通知您。快乐编码 ;-)

标签: c# azure exception azureservicebus azure-servicebus-topics


【解决方案1】:

当收到来自服务总线队列或主题订阅的消息时,将与消息一起返回一个锁定令牌。

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

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

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

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

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

【讨论】:

  • 我现在测试并返回给你。谢谢。
  • 嘿@arunprabhu 你能解释一下锁定持续时间的目的是什么吗?在哪些情况下我需要将其设置为最大(5 分钟)以及它如何对应于ProcessEvent 的持续时间?如果持续时间长于流程持续时间?什么时候不是。
【解决方案2】:

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

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

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

client.OnMessage(processCalculations, options);

看到这个Similar SO Solution

【讨论】:

    猜你喜欢
    • 2015-06-26
    • 2021-05-23
    • 2022-10-04
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多