我正在使用服务总线在 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);
?>
这段代码完美执行 - 检索消息,显示正文,然后删除消息。但是,如果我sleep(5);
在 deleteMessage() 调用之前插入一个,服务总线 API 会返回以下错误:
错误:提供的锁无效。锁已过期,或者消息已从队列中删除。
通过 Azure 门户创建队列时,我将锁定超时时间明确设置为 5 分钟,并且我尝试在其他队列上设置不同的超时时间,并且所有队列仍然恢复为 5 秒到期。
我在这里做错了什么?
问题解决了:
我收到了 Azure 支持团队的回复,他们很快发现 Azure 门户没有保留在创建队列时选择的锁定持续时间。默认到期时间显然是 5 秒(尽管我在任何文档中都找不到对此默认值的任何引用,这很烦人),这就是它超时的原因。
所以无论如何,开发团队显然正在努力修复,一切应该很快就会工作。