为啥我收到“提供的锁无效”。当我尝试使用 LockTocken 删除队列消息时出错

Posted

技术标签:

【中文标题】为啥我收到“提供的锁无效”。当我尝试使用 LockTocken 删除队列消息时出错【英文标题】: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']) 【参考方案1】:

尝试增加 lock_duration。

完成后,这里是 servicebus https://pypi.org/project/azure-servicebus/7.0.0/v7 中的代码

https://github.com/Azure/azure-sdk-for-python/blob/master/sdk/servicebus/azure-servicebus/samples/sync_samples/receive_queue.py

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

谢谢@Sean Feldman 的回答我已经检查过了,发现 Locktoken 每 60 秒过期一次。所以有什么办法可以增加这些时间或为 LockToken 设置更多时间。跨度> 是的,有。您可以将MaxLockDuration 设置为最多 5 分钟。您将需要使用门户或工具来执行此操作。 ServiceBus Explorer、Queue Explorer 或 Cerebrate Cerulean。

以上是关于为啥我收到“提供的锁无效”。当我尝试使用 LockTocken 删除队列消息时出错的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试保存测试计划时,为啥会收到 NoClassDefFound 错误?

当我尝试访问我的 CodeIgniter 应用程序时,为啥会收到 404 错误?

当我尝试在我的代码中使用 re.sub 表达式时,为啥会收到一个名为“预期字符串或类似对象的字节”的错误 [重复]

当我尝试使用 EF 在 ASP.NET MVC5 中查询视图时,为啥会收到错误“数据库 'ELITEPROD' 中的 CREATE TABLE 权限被拒绝”?

当我尝试从双向链表中删除最后一个元素时,为啥会收到“信号 SIGSEGV,分段错误”?

javax.mail.SendFailedException 为啥当我尝试通过我的 java 代码发送电子邮件时收到上述异常?