Azure服务总线PeekLock在5秒后就超时了


Azure Service Bus PeekLock is timing out after just five seconds

我正在使用服务总线在Azure上构建消息队列,通过PHP SDK工作,并且我有一些PeekLock消息超时太快的问题。

我可以连接到队列并使用PeekLock检索消息,但是,如果删除消息的时间超过5秒,Azure就会抛出404错误,表示锁已过期,并且消息将被放回队列中,就好像它从未被处理过一样。

下面是我使用的一些测试代码的示例。在这个示例中,假设已经加载了Azure SDK,并且已经引用了适当的名称空间。

<?php
  // .. load the sdk and namespaces etc ...
  $service_bus = ServicesBuilder::getInstance()->createServiceBusService([connection string goes here]);
  $options = new ReceiveMessageOptions();
  $options->setPeekLock();
  $message = $service_bus->receiveQueueMessage("[queue name here]", $options);
  print "message body is: " . $message->getBody();
  $service_bus->deleteMessage($message);
?>

此代码执行完美—检索消息,显示正文,并删除消息。但是,如果在deleteMessage()调用之前插入sleep(5);,则服务总线API返回以下错误:

错误:提供的锁无效。锁定已过期,或者消息已从队列中删除。

在通过Azure门户创建队列时,我显式地将锁定超时时间设置为5分钟,并且我尝试在其他队列上设置不同的超时时间,但它们仍然恢复为5秒过期。

我在这里做错了什么?

问题已解决:

我得到了Azure支持团队的回复,他们很快发现Azure门户没有持久化创建队列时选择的锁持续时间。默认过期显然是5秒(尽管我在任何文档中都找不到对这个默认值的任何引用,这很烦人),这就是为什么它超时了。

所以,无论如何,开发团队显然正在修复,一切都应该很快工作。

实际上默认的MessageLock持续时间默认为60秒(当使用c# sdk创建时,我不确定php sdk)…你可以增加到5分钟……您可以在使用QueueDescription创建sb队列时自定义它。

此处指定的默认锁定时间