我正在Azure上使用Service Bus构建一个消息队列,正在使用PHP SDK,并且PeekLock消息的一些问题超时太快了。
我可以使用PeekLock连接到队列并检索消息,但是,如果我花了超过五秒的时间来删除消息,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);
,Service Bus API将返回以下错误:
错误:提供的锁无效。锁定已过期,或者消息已从队列中删除。
通过Azure门户创建队列时,我明确将锁定超时时间设置为五分钟,并且我已经尝试在其他队列上设置不同的超时时间段,并且所有这些时间段仍然恢复到五秒钟到期。
我在这里做错了什么?
我收到了Azure支持团队的回复,他很快发现Azure门户没有持久保存在创建队列时选择的锁定持续时间。默认的到期时间显然是五秒钟(虽然我在任何文档中找不到任何对此默认值的引用,这很烦人),这就是为什么它会超时。
所以无论如何,开发团队显然正在努力修复,一切都应该很快就会开始。
答案 0 :(得分:0)
实际默认的MessageLock持续时间是默认的60秒(使用C#sdk创建时,我不确定php sdk)...你可以将它增加到5分钟...你可以在创建时自定义它使用QueueDescription的sb队列。
答案 1 :(得分:0)
指定的默认锁定持续时间为 here。