11

我正在使用服务总线在 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 秒(尽管我在任何文档中都找不到对此默认值的任何引用,这很烦人),这就是它超时的原因。

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

4

2 回答 2

0

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

于 2013-01-24T15:09:30.473 回答
0

此处指定的默认锁定持续时间。

于 2021-04-15T02:22:03.447 回答