【问题标题】:Why am I getting "The lock supplied is invalid." error when I am trying to delete queue message using LockTocken为什么我收到“提供的锁无效”。当我尝试使用 LockTocken 删除队列消息时出错
【发布时间】:2019-11-02 01:00:48
【问题描述】:

我正在使用 python 语言通过 Azure 总线服务队列发送和接收消息。

使用以下代码从队列中删除消息时,我收到“提供的锁无效。锁已过期,或者消息已从队列中删除”。

sbs.delete_queue_message('taskqueue',5,'ef4e2189-bfef-42ac-ba09-7fd20287f6a9') sbs.delete_queue_message('taskqueue','SequenceNumber','LockToken')

from azure.servicebus.control_client import ServiceBusService, Message, Topic, Rule, DEFAULT_RULE_NAME
key_name = '###############' # SharedAccessKeyName from Azure portal
key_value = '####################' # SharedAccessKey from Azure portal
service_namespace = '###########'
sbs  = ServiceBusService(service_namespace,shared_access_key_name=key_name,shared_access_key_value=key_value)      


msg = sbs.receive_queue_message('taskqueue')
sbs.delete_queue_message('taskqueue',5,'ef4e2189-bfef-42ac-ba09-7fd20287f6a9')

【问题讨论】:

  • 您从哪里获得此锁定令牌 (ef4e2189-bfef-42ac-ba09-7fd20287f6a9) 值?
  • 使用 msg.broker_properties['LockToken'])

标签: python azure message-queue azureservicebus


【解决方案1】:
【解决方案2】:

终于能够通过从门户网站将锁定持续时间从默认值增加到 300 秒来解决上述问题。

增加锁定持续时间后,我能够成功运行我的项目,而不会出现任何与锁定相关的错误。

【讨论】:

    【解决方案3】:

    如果消息的处理时间超过为队列指定的MaxLockDuration,则锁定可能会过期。检查taskqueue 队列的值是什么,以及从收到消息到调用delete_queue_message() 的消息处理持续时间。

    另外一个考虑因素是预取,但我不确定它是否已为 Python 客户端启用。值得验证它是否设置为零或不会导致消息在等待处理时丢失锁定。

    【讨论】:

    • 谢谢@Sean Feldman 的回答我已经检查过了,发现 Locktoken 每 60 秒过期一次。所以有什么办法可以增加这些时间或为 LockToken 设置更多时间。跨度>
    • 是的,有。您可以将MaxLockDuration 设置为最多 5 分钟。您将需要使用门户或工具来执行此操作。 ServiceBus Explorer、Queue Explorer 或 Cerebrate Cerulean。
    猜你喜欢
    • 1970-01-01
    • 2020-07-12
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 2020-10-13
    • 1970-01-01
    • 2017-01-17
    相关资源
    最近更新 更多